Skip to content

Commit c4e18c6

Browse files
authored
onPlayerTeamChange Event (#3370)
1 parent 74ec865 commit c4e18c6

File tree

2 files changed

+43
-12
lines changed

2 files changed

+43
-12
lines changed

Server/mods/deathmatch/logic/CGame.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1591,6 +1591,7 @@ void CGame::AddBuiltInEvents()
15911591
m_Events.AddEvent("onPlayerProjectileCreation", "weaponType, posX, posY, posZ, force, target, rotX, rotY, rotZ, velX, velY, velZ", nullptr, false);
15921592
m_Events.AddEvent("onPlayerDetonateSatchels", "", nullptr, false);
15931593
m_Events.AddEvent("onPlayerTriggerEventThreshold", "", nullptr, false);
1594+
m_Events.AddEvent("onPlayerTeamChange", "oldTeam, newTeam", nullptr, false);
15941595

15951596
// Ped events
15961597
m_Events.AddEvent("onPedVehicleEnter", "vehicle, seat, jacked", NULL, false);

Server/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -328,19 +328,36 @@ bool CStaticFunctionDefinitions::DestroyElement(CElement* pElement)
328328

329329
// We can't destroy the root or a player/remote client/console
330330
int iType = pElement->GetType();
331-
if (pElement == m_pMapManager->GetRootElement() || iType == CElement::PLAYER || iType == CElement::CONSOLE ||
331+
if (pElement == m_pMapManager->GetRootElement() || iType == CElement::PLAYER || iType == CElement::CONSOLE ||
332332
g_pGame->GetResourceManager()->IsAResourceElement(pElement))
333333
{
334334
return false;
335335
}
336336

337+
if (iType == CElement::TEAM) { // Its team trigger onPlayerTeamChange for each player in the team
338+
CTeam* pTeam = static_cast<CTeam*>(pElement);
339+
340+
auto iterBegin = pTeam->PlayersBegin();
341+
auto iterEnd = pTeam->PlayersEnd();
342+
CLuaArguments arguments;
343+
344+
for (auto iter = iterBegin; iter != iterEnd; ++iter)
345+
{
346+
CPlayer* player = *iter;
347+
arguments.PushElement(pTeam); // Return team element as oldteam
348+
arguments.PushNil(); // No new team return nil
349+
player->CallEvent("onPlayerTeamChange", arguments);
350+
arguments.DeleteArguments();
351+
}
352+
}
353+
337354
// Tell everyone to destroy it if this is not a per-player entity
338355
if (IS_PERPLAYER_ENTITY(pElement))
339356
{
340357
// Unsync it (will destroy it for those that know about it)
341358
CPerPlayerEntity* pEntity = static_cast<CPerPlayerEntity*>(pElement);
342359
pEntity->Sync(false);
343-
}
360+
}
344361

345362
// Tell everyone to destroy it
346363
CEntityRemovePacket Packet;
@@ -9204,21 +9221,34 @@ bool CStaticFunctionDefinitions::SetPlayerTeam(CPlayer* pPlayer, CTeam* pTeam)
92049221
{
92059222
assert(pPlayer);
92069223

9224+
CTeam* currentTeam = pPlayer->GetTeam();
92079225
// If its a different team
9208-
if (pTeam != pPlayer->GetTeam())
9226+
if (pTeam == currentTeam)
9227+
return false;
9228+
9229+
// Call the Event
9230+
CLuaArguments Arguments;
9231+
if (currentTeam)
92099232
{
9210-
// Change his team
9211-
pPlayer->SetTeam(pTeam, true);
9233+
Arguments.PushElement(currentTeam);
9234+
}
9235+
else
9236+
{
9237+
Arguments.PushNil(); // No oldTeam return nil
9238+
}
9239+
Arguments.PushElement(pTeam);
9240+
if (!pPlayer->CallEvent("onPlayerTeamChange", Arguments))
9241+
return false; // Event cancelled, return false
92129242

9213-
// Tell everyone his new team
9214-
CBitStream BitStream;
9215-
BitStream.pBitStream->Write(pTeam ? pTeam->GetID() : INVALID_ELEMENT_ID);
9216-
m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pPlayer, SET_PLAYER_TEAM, *BitStream.pBitStream));
9243+
// Change his team
9244+
pPlayer->SetTeam(pTeam, true);
92179245

9218-
return true;
9219-
}
9246+
// Tell everyone his new team
9247+
CBitStream BitStream;
9248+
BitStream.pBitStream->Write(pTeam ? pTeam->GetID() : INVALID_ELEMENT_ID);
9249+
m_pPlayerManager->BroadcastOnlyJoined(CElementRPCPacket(pPlayer, SET_PLAYER_TEAM, *BitStream.pBitStream));
92209250

9221-
return false;
9251+
return true;
92229252
}
92239253

92249254
bool CStaticFunctionDefinitions::SetTeamFriendlyFire(CTeam* pTeam, bool bFriendlyFire)

0 commit comments

Comments
 (0)