@@ -328,19 +328,36 @@ bool CStaticFunctionDefinitions::DestroyElement(CElement* pElement)
328
328
329
329
// We can't destroy the root or a player/remote client/console
330
330
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 ||
332
332
g_pGame->GetResourceManager ()->IsAResourceElement (pElement))
333
333
{
334
334
return false ;
335
335
}
336
336
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
+
337
354
// Tell everyone to destroy it if this is not a per-player entity
338
355
if (IS_PERPLAYER_ENTITY (pElement))
339
356
{
340
357
// Unsync it (will destroy it for those that know about it)
341
358
CPerPlayerEntity* pEntity = static_cast <CPerPlayerEntity*>(pElement);
342
359
pEntity->Sync (false );
343
- }
360
+ }
344
361
345
362
// Tell everyone to destroy it
346
363
CEntityRemovePacket Packet;
@@ -9204,21 +9221,34 @@ bool CStaticFunctionDefinitions::SetPlayerTeam(CPlayer* pPlayer, CTeam* pTeam)
9204
9221
{
9205
9222
assert (pPlayer);
9206
9223
9224
+ CTeam* currentTeam = pPlayer->GetTeam ();
9207
9225
// 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)
9209
9232
{
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
9212
9242
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 );
9217
9245
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 ));
9220
9250
9221
- return false ;
9251
+ return true ;
9222
9252
}
9223
9253
9224
9254
bool CStaticFunctionDefinitions::SetTeamFriendlyFire (CTeam* pTeam, bool bFriendlyFire)
0 commit comments