dboolean G_CheckSpot(int playernum, mapthing_t* mthing) { fixed_t x; fixed_t y; subsector_t* ss; angle_t an; mobj_t* mo; int i; if(!players[playernum].mo) { // first spawn of level, before corpses for(i = 0; i < playernum; i++) { if((players[i].mo->x == INT2F(mthing->x)) && (players[i].mo->y == INT2F(mthing->y))) { return false; } } return true; } x = INT2F(mthing->x); y = INT2F(mthing->y); if(!P_CheckPosition(players[playernum].mo, x, y)) { return false; } // flush an old corpse if needed if(bodyqueslot >= BODYQUESIZE) { P_RemoveMobj(bodyque[bodyqueslot % BODYQUESIZE]); } bodyque[bodyqueslot%BODYQUESIZE] = players[playernum].mo; bodyqueslot++; // spawn a teleport fog ss = R_PointInSubsector(x, y); // 20120402 villsa - force angle_t typecast to avoid issues on 64-bit machines an = ANG45 * (angle_t)(mthing->angle / 45); mo = P_SpawnMobj( x + 20*dcos(an), y + 20*dsin(an), ss->sector->floorheight, MT_TELEPORTFOG ); if(players[playernum].viewz != 1) { S_StartSound(mo, sfx_telept); // don't start sound on first frame } return true; }
static CMD(SpawnThing) { int id = 0; player_t *player; mobj_t *thing; fixed_t x, y, z; if(gamestate != GS_LEVEL) { return; } if(!param[0]) { return; } if(netgame) { return; } id = datoi(param[0]); if(id >= NUMMOBJTYPES || id < 0) { return; } player = &players[consoleplayer]; x = player->mo->x + FixedMul(INT2F(64) + mobjinfo[id].radius, dcos(player->mo->angle)); y = player->mo->y + FixedMul(INT2F(64) + mobjinfo[id].radius, dsin(player->mo->angle)); z = player->mo->z; thing = P_SpawnMobj(x, y, z, id); if(thing->info->spawnstate == S_000) { P_RemoveMobj(thing); return; } thing->angle = player->mo->angle; }
// // P_UnArchiveWorld // void P_UnArchiveWorld(void) { int i; int j; sector_t *sec; line_t *li; light_t *light; side_t *si; // do sectors for(i = 0, sec = sectors; i < numsectors; i++, sec++) { sec->floorheight = INT2F(saveg_read16()); sec->ceilingheight = INT2F(saveg_read16()); sec->floorpic = saveg_read16(); sec->ceilingpic = saveg_read16(); sec->special = saveg_read16(); sec->tag = saveg_read16(); sec->flags = saveg_read16(); sec->lightlevel = saveg_read16(); sec->xoffset = saveg_read32(); sec->yoffset = saveg_read32(); saveg_set_mobjtarget(&sec->soundtarget, saveg_read_mobjindex()); for(j = 0; j < 5; j++) { sec->colors[j] = saveg_read16(); } sec->specialdata = 0; } // do lines for(i = 0, li = lines; i < numlines; i++, li++) { li->flags = (saveg_read16() << 16); li->flags = li->flags | (saveg_read16() & 0xFFFF); li->special = saveg_read16(); li->tag = saveg_read16(); for(j = 0; j < 2; j++) { if(li->sidenum[j] == NO_SIDE_INDEX) { continue; } si = &sides[li->sidenum[j]]; si->textureoffset = INT2F(saveg_read16()); si->rowoffset = INT2F(saveg_read16()); si->toptexture = saveg_read16(); si->bottomtexture = saveg_read16(); si->midtexture = saveg_read16(); } } // do lights for(i = 0, light = lights; i < numlights; i++, light++) { light->base_r = saveg_read8(); light->base_g = saveg_read8(); light->base_b = saveg_read8(); light->active_r = saveg_read8(); light->active_g = saveg_read8(); light->active_b = saveg_read8(); light->r = saveg_read8(); light->g = saveg_read8(); light->b = saveg_read8(); saveg_read_pad(); light->tag = saveg_read16(); } }