void CGameControllerOpenFNG::HandleFreeze(int Killer, int Victim) { CCharacter *pVictim = CHAR(Victim); if (!pVictim) // for odd reasons, this can happen (confirmed by segfault). didn't yet track down why { D("no pVictim in HandleFreeze(%d, %d)", Killer, Victim); return; } if (CFG(BleedOnFreeze)) { pVictim->Bleed(1); GS->CreateSound(pVictim->m_Pos, SOUND_CTF_RETURN); } int FailTeam = pVictim->GetPlayer()->GetTeam() & 1; m_aTeamscore[1 - FailTeam] += CFG(FreezeTeamscore); if (CFG(FreezeTeamscore) && CFG(FreezeBroadcast)) //probably of no real use but for completeness... { char aBuf[64]; str_format(aBuf, sizeof aBuf, "%s froze (%+d)", GetTeamName(1-FailTeam), CFG(FreezeTeamscore)); m_Broadcast.Update(-1, aBuf, CFG(BroadcastTime) * TS); } CPlayer *pPlKiller = TPLAYER(Killer); CPlayer *pPlVictim = TPLAYER(Victim); if (!pPlKiller || !pVictim) return; //freezing counts as a hostile interaction m_aLastInteraction[pVictim->GetPlayer()->GetCID()] = pPlKiller->GetCID(); pPlKiller->m_Score += CFG(FreezeScore); pPlVictim->m_Score += CFG(FreezeScoreVic); SendFreezeKill(Killer, Victim, WEAPON_RIFLE); if (pPlKiller->GetCharacter()) { GS->CreateSound(pPlKiller->GetCharacter()->m_Pos, SOUND_HIT, (1<<pPlKiller->GetCID())); if (CFG(FreezeLoltext) && CFG(FreezeScore)) { char aBuf[64]; str_format(aBuf, sizeof aBuf, "%+d", CFG(FreezeScore)); GS->CreateLolText(pPlKiller->GetCharacter(), false, vec2(0.f, -50.f), vec2(0.f, 0.f), 50, aBuf); } } }
void CGameControllerOpenFNG::HandleMelt(int Melter, int Meltee) { CCharacter *pMeltee = CHAR(Meltee); if (!pMeltee) //due to HandleFreeze, i suspect this COULD also possibly happen. { D("no pMeltee in HandleMelt(%d, %d)", Melter, Meltee); return; } int MeltTeam = pMeltee->GetPlayer()->GetTeam()&1; m_aTeamscore[MeltTeam] += CFG(MeltTeamscore); if (CFG(MeltTeamscore) && CFG(MeltBroadcast)) { char aBuf[64]; str_format(aBuf, sizeof aBuf, "%s melted (%+d)", GetTeamName(MeltTeam), CFG(MeltTeamscore)); m_Broadcast.Update(-1, aBuf, CFG(BroadcastTime) * TS); } CPlayer *pPlMelter = TPLAYER(Melter); if (!pPlMelter) return; pPlMelter->m_Score += CFG(MeltScore); SendFreezeKill(Melter, Meltee, WEAPON_HAMMER); if (pPlMelter->GetCharacter() && CFG(MeltLoltext) && CFG(MeltScore)) { char aBuf[64]; str_format(aBuf, sizeof aBuf, "%+d", CFG(MeltScore)); GS->CreateLolText(pPlMelter->GetCharacter(), false, vec2(0.f, -50.f), vec2(0.f, 0.f), 50, aBuf); } }
void CGameControllerOpenFNG::HandleSacr(int Killer, int Victim, int ShrineTeam) {//assertion: Killer >= 0, victim anyways CCharacter *pVictim = CHAR(Victim); if (!pVictim) //due to HandleFreeze, i suspect this COULD also possibly happen. { D("no pVictim in HandleSacr(%d, %d, %d)", Killer, Victim, ShrineTeam); return; } int FailTeam = pVictim->GetPlayer()->GetTeam(); bool Wrong = ShrineTeam != -1 && FailTeam == ShrineTeam; m_aTeamscore[1-FailTeam] += Wrong?CFG(WrongSacrTeamscore):(ShrineTeam == -1 ? CFG(SacrTeamscore) : CFG(RightSacrTeamscore)); if (!Wrong) { if (CFG(SacrSound) == 1) GameServer()->CreateSoundGlobal(SOUND_CTF_CAPTURE); else if (CFG(SacrSound) == 2) GameServer()->CreateSound(pVictim->m_Pos, SOUND_CTF_CAPTURE); } if (((Wrong && CFG(WrongSacrTeamscore)) || (!Wrong && (ShrineTeam == -1 ? CFG(SacrTeamscore) : CFG(RightSacrTeamscore)))) && CFG(SacrBroadcast)) { char aBuf[64]; str_format(aBuf, sizeof aBuf, "%s sacrificed%s (%+d)", GetTeamName(1-FailTeam), Wrong?" in wrong shrine":(ShrineTeam == -1 ? "" : ", pleasing their gods"), Wrong?CFG(WrongSacrTeamscore):(ShrineTeam == -1 ? CFG(SacrTeamscore):CFG(RightSacrTeamscore))); m_Broadcast.Update(-1, aBuf, CFG(BroadcastTime) * TS); } CPlayer *pPlKiller = TPLAYER(Killer); if (!pPlKiller) return; pPlKiller->m_Score += Wrong?CFG(WrongSacrScore):(ShrineTeam == -1 ? CFG(SacrScore) : CFG(RightSacrScore)); SendKill(Killer, Victim, WEAPON_NINJA); if(!Wrong && pPlKiller->GetCharacter()) GameServer()->GetPlayerChar(Killer)->AddSpree(); if (Wrong && pPlKiller->GetCharacter() && CFG(PunishWrongSacr)) { pPlKiller->GetCharacter()->Freeze(CFG(PunishWrongSacr) * TS); GS->CreateSound(pPlKiller->GetCharacter()->m_Pos, SOUND_PLAYER_PAIN_LONG); GS->SendChatTarget(pPlKiller->GetCID(), "The gods are not pleased with this sacrifice!"); } if (!Wrong && pPlKiller->GetCharacter()) pPlKiller->GetCharacter()->SetEmote(EMOTE_HAPPY, TICK + TS * 2); if (pPlKiller->GetCharacter() && CFG(SacrLoltext) && ((!Wrong && CFG(SacrScore)) || (Wrong && CFG(WrongSacrScore)))) { char aBuf[64]; str_format(aBuf, sizeof aBuf, "%+d", Wrong?CFG(WrongSacrScore):(ShrineTeam == -1 ? CFG(SacrScore) : CFG(RightSacrScore))); GS->CreateLolText(pPlKiller->GetCharacter(), false, vec2(0.f, -50.f), vec2(0.f, 0.f), 50, aBuf); } }
bool CGameControllerOpenFNG::DoEmpty() { bool Empty = true; for(int i = 0; Empty && i < MAX_CLIENTS; i++) if (TPLAYER(i)) Empty = false; if (Empty) m_aTeamscore[0] = m_aTeamscore[1] = 0; return Empty; }
void CGameControllerOpenFNG::DoHookers() { for(int i = 0; i < MAX_CLIENTS; i++) { CCharacter *pChr = CHAR(i); if (!pChr) continue; int Hooking = pChr->GetHookedPlayer(); if (Hooking >= 0) { CCharacter *pVic = CHAR(Hooking); if (!pVic || (pVic->GetPlayer()->GetTeam() != pChr->GetPlayer()->GetTeam() && pChr->GetHookTick() < CFG(HookRegisterDelay))) Hooking = -1; } int HammeredBy = pChr->LastHammeredBy(); pChr->ClearLastHammeredBy(); if (Hooking >= 0) { CCharacter *pVic = CHAR(Hooking); if (pVic) { bool SameTeam = pChr->GetPlayer()->GetTeam() == pVic->GetPlayer()->GetTeam(); m_aLastInteraction[Hooking] = SameTeam ? -1 : i; } } /* CPlayer *pPlayer = TPLAYER(Hooking); if (pVic) { bool SameTeam = pChr->GetPlayer()->GetTeam() == pVic->GetPlayer()->GetTeam(); m_aLastInteraction[Hooking] = SameTeam ? -1 : i; if(pPlayer) { if (!SameTeam && CFG(HammerFreeze) && pVic->GetFreezeTicks() <= 0) { pVic->Freeze(CFG(HammerFreeze) * TS, i); m_aFrozenBy[Hooking] = i; //suppress kill event being generated } } } */ if (HammeredBy >= 0) { CCharacter *pHam = CHAR(HammeredBy); CPlayer *pPlayer = TPLAYER(HammeredBy); if (pHam) { bool SameTeam = pChr->GetPlayer()->GetTeam() == pHam->GetPlayer()->GetTeam(); m_aLastInteraction[i] = SameTeam ? -1 : HammeredBy; if(pPlayer) { if (!SameTeam && CFG(HammerFreeze) && pChr->GetFreezeTicks() <= 0 && pPlayer->m_HammerFreeze) { pChr->Freeze(CFG(HammerFreeze) * TS, HammeredBy); m_aFrozenBy[i] = HammeredBy; //suppress kill event being generated } } } else m_aLastInteraction[i] = -1; } } }