// // [Toke - CTF] CTF_MoveFlag // Moves the flag that is linked to a player // void CTF_MoveFlags () { // denis - flag is now a boolean for(size_t i = 0; i < NUMFLAGS; i++) { if(CTFdata[i].flagger && CTFdata[i].actor) { player_t &player = idplayer(CTFdata[i].flagger); AActor *flag = CTFdata[i].actor; if (!validplayer(player) || !player.mo) { // [SL] 2012-12-13 - Remove a flag if it's being carried but // there's not a valid player carrying it (should not happen) CTFdata[i].flagger = 0; CTFdata[i].state = flag_home; if(CTFdata[i].actor) CTFdata[i].actor->Destroy(); continue; } unsigned an = player.mo->angle >> ANGLETOFINESHIFT; fixed_t x = (player.mo->x + FixedMul (-2*FRACUNIT, finecosine[an])); fixed_t y = (player.mo->y + FixedMul (-2*FRACUNIT, finesine[an])); CL_MoveThing(flag, x, y, player.mo->z); } }
// // [Toke - CTF] CTF_RunTics // Runs once per gametic when ctf is enabled // void CTF_RunTics (void) { for(size_t i = 0; i < NUMFLAGS; i++) { flagdata *data = &CTFdata[i]; if(data->state != flag_dropped) continue; if (!ctf_flagtimeout) continue; if(data->timeout--) continue; if(data->actor) data->actor->Destroy(); SV_CTFEvent ((flag_t)i, SCORE_RETURN, idplayer(0)); SV_BroadcastPrintf (PRINT_HIGH, "%s flag returned.\n", team_names[i]); CTF_SpawnFlag((flag_t)i); } }
// // [Toke - CTF] CTF_MoveFlag // Moves the flag that is linked to a player // void CTF_MoveFlags () { // denis - flag is now a boolean for(size_t i = 0; i < NUMFLAGS; i++) { if(CTFdata[i].flagger && CTFdata[i].actor) { player_t &player = idplayer(CTFdata[i].flagger); AActor *flag = CTFdata[i].actor; if(!player.mo) { flag->UnlinkFromWorld (); return; } extern fixed_t tmfloorz; extern fixed_t tmceilingz; unsigned an = player.mo->angle >> ANGLETOFINESHIFT; fixed_t x = (player.mo->x + FixedMul (-2*FRACUNIT, finecosine[an])); fixed_t y = (player.mo->y + FixedMul (-2*FRACUNIT, finesine[an])); P_CheckPosition (player.mo, player.mo->x, player.mo->y); flag->UnlinkFromWorld (); flag->x = x; flag->y = y; flag->z = player.mo->z; flag->floorz = tmfloorz; flag->ceilingz = tmceilingz; flag->LinkToWorld (); } }
bool setup(const std::vector<std::string> &args, const player_t &player) { if (!Vote::setup_check_cvar()) return false; // Run forcespec command check. size_t pid; if (!CMD_ForcespecCheck(args, this->error, pid)) { return false; } // Stop the player from trying to forcespec himself. if (pid == player.id) { this->error = "You can't vote forcespec yourself! Try 'spectate' instead."; return false; } // Store forcespec information this->id = pid; this->netname = idplayer(pid).userinfo.netname; // Create votestring std::ostringstream buffer; buffer << "forcespec " << this->netname << " (id:" << pid << ")"; this->votestring = buffer.str(); return true; }
// // [Toke - CTF] CL_CTFEvent // Deals with CTF specific network data // void CL_CTFEvent (void) { flag_score_t event = (flag_score_t)MSG_ReadByte(); if(event == SCORE_NONE) // CTF state refresh { CTF_Connect(); return; } flag_t flag = (flag_t)MSG_ReadByte(); player_t &player = idplayer(MSG_ReadByte()); int points = MSG_ReadLong(); if(validplayer(player)) player.points = points; for(size_t i = 0; i < NUMFLAGS; i++) TEAMpoints[i] = MSG_ReadLong (); switch(event) { default: case SCORE_NONE: case SCORE_REFRESH: case SCORE_KILL: case SCORE_BETRAYAL: case SCORE_CARRIERKILL: break; case SCORE_GRAB: case SCORE_FIRSTGRAB: case SCORE_MANUALRETURN: if(validplayer(player)) CTF_CarryFlag(player, flag); break; case SCORE_RETURN: case SCORE_CAPTURE: if(validplayer(player)) CTF_CheckFlags(player); else CTFdata[flag].flagger = 0; CTFdata[flag].state = flag_home; if(CTFdata[flag].actor) CTFdata[flag].actor->Destroy(); break; case SCORE_DROP: if(validplayer(player)) CTF_CheckFlags(player); else CTFdata[flag].flagger = 0; CTFdata[flag].state = flag_dropped; if(CTFdata[flag].actor) CTFdata[flag].actor->Destroy(); break; } }
void WI_drawDeathmatchStats() { // draw animated background WI_drawAnimatedBack(); WI_drawLF(); // [RH] Draw heads-up scores display HU_DrawScores(&idplayer(me)); }
bool tic() { if (!validplayer(idplayer(this->id))) { std::ostringstream buffer; buffer << this->netname << " left the server."; this->error = buffer.str(); return false; } if (idplayer(this->id).spectator) { std::ostringstream buffer; buffer << this->netname << " became a spectator on his own."; this->error = buffer.str(); return false; } return true; }
// // CTF_Connect // Receive states of all flags // void CTF_Connect() { size_t i; // clear player flags client may have imagined for(i = 0; i < players.size(); i++) for(size_t j = 0; j < NUMFLAGS; j++) players[i].flags[j] = false; for(i = 0; i < NUMFLAGS; i++) { CTFdata[i].state = (flag_state_t)MSG_ReadByte(); byte flagger = MSG_ReadByte(); if(CTFdata[i].state == flag_carried) { player_t &player = idplayer(flagger); if(validplayer(player)) CTF_CarryFlag(player, (flag_t)i); } } }
// // [Toke - CTF] CL_CTFEvent // Deals with CTF specific network data // void CL_CTFEvent (void) { flag_score_t event = (flag_score_t)MSG_ReadByte(); if(event == SCORE_NONE) // CTF state refresh { CTF_Connect(); return; } flag_t flag = (flag_t)MSG_ReadByte(); player_t &player = idplayer(MSG_ReadByte()); int points = MSG_ReadLong(); if(validplayer(player)) player.points = points; for(size_t i = 0; i < NUMFLAGS; i++) TEAMpoints[i] = MSG_ReadLong (); switch(event) { default: case SCORE_NONE: case SCORE_REFRESH: case SCORE_KILL: case SCORE_BETRAYAL: case SCORE_CARRIERKILL: break; case SCORE_GRAB: case SCORE_FIRSTGRAB: case SCORE_MANUALRETURN: if(validplayer(player)) { CTF_CarryFlag(player, flag); if (player.id == displayplayer().id) player.bonuscount = BONUSADD; } break; case SCORE_CAPTURE: if (validplayer(player)) { player.flags[flag] = 0; } CTFdata[flag].flagger = 0; CTFdata[flag].state = flag_home; if(CTFdata[flag].actor) CTFdata[flag].actor->Destroy(); break; case SCORE_RETURN: if (validplayer(player)) { player.flags[flag] = 0; } CTFdata[flag].flagger = 0; CTFdata[flag].state = flag_home; if(CTFdata[flag].actor) CTFdata[flag].actor->Destroy(); break; case SCORE_DROP: if (validplayer(player)) { player.flags[flag] = 0; } CTFdata[flag].flagger = 0; CTFdata[flag].state = flag_dropped; if(CTFdata[flag].actor) CTFdata[flag].actor->Destroy(); break; } // [AM] Play CTF sound, moved from server. CTF_Sound(flag, event); }
player_t &displayplayer() { return idplayer(displayplayer_id); }
player_t &consoleplayer() { return idplayer(consoleplayer_id); }
void ST_newDrawCTF (void) { player_t *plyr = &consoleplayer(); int xscale = hud_scale ? CleanXfac : 1; int yscale = hud_scale ? CleanYfac : 1; const patch_t *flagbluepatch = flagiconbhome; const patch_t *flagredpatch = flagiconrhome; switch(CTFdata[it_blueflag].state) { case flag_carried: if (CTFdata[it_blueflag].flagger) { player_t &player = idplayer(CTFdata[it_blueflag].flagger); if (player.userinfo.team == TEAM_BLUE) flagbluepatch = flagiconbtakenbyb; else if (player.userinfo.team == TEAM_RED) flagbluepatch = flagiconbtakenbyr; else if (player.userinfo.team == TEAM_GOLD) flagbluepatch = flagiconbtakenbyg; } break; case flag_dropped: flagbluepatch = flagiconbdropped; break; default: break; } switch(CTFdata[it_redflag].state) { case flag_carried: if (CTFdata[it_redflag].flagger) { player_t &player = idplayer(CTFdata[it_redflag].flagger); if (player.userinfo.team == TEAM_BLUE) flagredpatch = flagiconrtakenbyb; else if (player.userinfo.team == TEAM_RED) flagredpatch = flagiconrtakenbyr; else if (player.userinfo.team == TEAM_GOLD) flagredpatch = flagiconrtakenbyg; } break; case flag_dropped: flagredpatch = flagiconrdropped; break; default: break; } // Draw score (in CTF) if (hud_scale) { if (plyr->userinfo.team == TEAM_BLUE) screen->DrawPatchCleanNoMove (flagiconbcur, screen->width - 19 * CleanXfac, 1 * CleanYfac); else if (plyr->userinfo.team == TEAM_RED) screen->DrawPatchCleanNoMove (flagiconrcur, screen->width - 19 * CleanXfac, 19 * CleanYfac); screen->DrawPatchCleanNoMove (flagbluepatch, screen->width - 18 * CleanXfac, 2 * CleanYfac); screen->DrawPatchCleanNoMove (flagredpatch, screen->width - 18 * CleanXfac, 20 * CleanYfac); } else { if (plyr->userinfo.team == TEAM_BLUE) screen->DrawPatch (flagiconbcur, screen->width - 19, 1); else if (plyr->userinfo.team == TEAM_RED) screen->DrawPatch (flagiconrcur, screen->width - 19, 19); screen->DrawPatch (flagbluepatch, screen->width - 18, 2); screen->DrawPatch (flagredpatch, screen->width - 18, 20); } ST_DrawNumRight (screen->width - 20 * xscale, 2 * yscale, screen, TEAMpoints[TEAM_BLUE]); ST_DrawNumRight (screen->width - 20 * xscale, 20 * yscale, screen, TEAMpoints[TEAM_RED]); }
void NetDemo::readSnapshotData(byte *buf, size_t length) { byte cid = consoleplayer_id; byte did = displayplayer_id; P_ClearAllNetIds(); // Remove all players players.clear(); // Remove all actors TThinkerIterator<AActor> iterator; AActor *mo; while ( (mo = iterator.Next() ) ) mo->Destroy(); gameaction = ga_nothing; FLZOMemFile memfile; length = 0; memfile.Open(buf); // open for reading FArchive arc(memfile); // Read the server cvars byte vars[4096], *vars_p; vars_p = vars; size_t len = arc.ReadCount (); arc.Read(vars, len); cvar_t::C_ReadCVars(&vars_p); std::string mapname; bool intermission; arc >> mapname; arc >> intermission; G_SerializeSnapshots(arc); P_SerializeRNGState(arc); P_SerializeACSDefereds(arc); // Read the status of flags in CTF for (int i = 0; i < NUMFLAGS; i++) arc >> CTFdata[i]; // Read team points for (int i = 0; i < NUMTEAMS; i++) arc >> TEAMpoints[i]; arc >> level.time; for (int i = 0; i < NUM_WORLDVARS; i++) arc >> ACS_WorldVars[i]; for (int i = 0; i < NUM_GLOBALVARS; i++) arc >> ACS_GlobalVars[i]; netgame = multiplayer = true; // load a base level savegamerestore = true; // Use the player actors in the savegame serverside = false; G_InitNew(mapname.c_str()); displayplayer_id = consoleplayer_id = 1; savegamerestore = false; // read consistancy marker byte check; arc >> check; arc.Close(); if (check != 0x1d) error("Bad snapshot"); consoleplayer_id = cid; // try to restore display player player_t *disp = &idplayer(did); if (validplayer(*disp) && disp->ingame() && !disp->spectator) displayplayer_id = did; else displayplayer_id = cid; // restore player colors for (size_t i = 0; i < players.size(); i++) R_BuildPlayerTranslation(players[i].id, players[i].userinfo.color); // Link the CTF flag actors to CTFdata[i].actor TThinkerIterator<AActor> flagiterator; while ( (mo = flagiterator.Next() ) ) { if (mo->type == MT_BDWN || mo->type == MT_BCAR) CTFdata[it_blueflag].actor = mo->ptr(); if (mo->type == MT_RDWN || mo->type == MT_RCAR) CTFdata[it_redflag].actor = mo->ptr(); } // Make sure the status bar is displayed correctly ST_Start(); }
void AActor::Serialize (FArchive &arc) { Super::Serialize (arc); if (arc.IsStoring ()) { int playerid = player ? player->id : 0; arc << x << y << z << pitch << angle << roll << sprite << frame << effects << floorz << ceilingz << radius << height << momx << momy << momz << type << tics << state << flags << health << movedir << visdir << movecount /*<< target ? target->netid : 0*/ /*<< lastenemy ? lastenemy->netid : 0*/ << reactiontime << threshold << playerid << lastlook /*<< tracer ? tracer->netid : 0*/ << tid /*<< goal ? goal->netid : 0*/ << (unsigned)0 << translucency << waterlevel; if (translation) arc << (DWORD)(translation - translationtables); else arc << (DWORD)0xffffffff; spawnpoint.Serialize (arc); } else { unsigned dummy; unsigned playerid; arc >> x >> y >> z >> pitch >> angle >> roll >> sprite >> frame >> effects >> floorz >> ceilingz >> radius >> height >> momx >> momy >> momz >> type >> tics >> state >> flags >> health >> movedir >> visdir >> movecount /*>> target->netid*/ /*>> lastenemy->netid*/ >> reactiontime >> threshold >> playerid >> lastlook /*>> tracer->netid*/ >> tid /*>> goal->netid*/ >> dummy >> translucency >> waterlevel; DWORD trans; arc >> trans; if (trans == (DWORD)0xffffffff) translation = NULL; else translation = translationtables + trans; spawnpoint.Serialize (arc); info = &mobjinfo[type]; touching_sectorlist = NULL; LinkToWorld (); AddToHash (); if(playerid && validplayer(idplayer(playerid))) { player = &idplayer(playerid); player->mo = ptr(); player->camera = player->mo; } } }
bool exec(void) { SV_SetPlayerSpec(idplayer(this->id), true); return true; }