Re: Mode Territory
Posted: 01 Nov 2012, 17:24
Sript mis a jours ! petit soucis de warmup sur la precedente version.
+1lolovainqueur wrote:sur quel serveur ?
Code: Select all
Void SelectWeaponsSpawn( Ident _TargetPlayerId )
{
declare PreRoundEndTime = Now + 8000;
declare UI <=> UIManager.GetUI(Players[_TargetPlayerId]);
if (UI == Null) continue;
declare netwrite Net_SelectionEndTime for UI = 0;
Net_SelectionEndTime = PreRoundEndTime;
if (Players[_TargetPlayerId].RequestedClan == G_CapturingClan) {
if (C_ForceAtkWeapon) continue;
declare LayerAttached = Layers::Attach("WeaponSelectionAttack", Players[_TargetPlayerId].Id);
} else {
if (C_ForceDefWeapon) continue;
declare LayerAttached = Layers::Attach("WeaponSelectionDefend", Players[_TargetPlayerId].Id);
}
// Send the number of rocket, laser and nucleus in each clan
while (PreRoundEndTime > Now)
{
sleep(100);
declare NbRocketAtk = 0;
declare NbRocketDef = 0;
declare NbLaserAtk = 0;
declare NbLaserDef = 0;
declare NbNucleusAtk = 0;
declare NbNucleusDef = 0;
foreach (Player in Players)
{
declare UI <=> UIManager.GetUI(Player);
if (UI == Null) continue;
declare netread Net_NewDefWeapon for UI = 1;
declare netread Net_NewAtkWeapon for UI = 1;
if (Player.RequestedClan == G_CapturingClan && Net_NewAtkWeapon == 2) {
NbLaserAtk += 1;
} else if (Player.RequestedClan == G_CapturingClan) {
NbRocketAtk += 1;
} else if (Player.RequestedClan == G_CapturingClan && Net_NewAtkWeapon == 3) {
NbNucleusAtk +=1;
} else if (Player.RequestedClan == 3 - G_CapturingClan && Net_NewDefWeapon == 2) {
NbLaserDef += 1;
} else if (Player.RequestedClan == 3 - G_CapturingClan && Net_NewDefWeapon == 3) {
NbNucleusDef += 1;
} else {
NbRocketDef += 1;
}
}
foreach (Player in Players) {
declare UI <=> UIManager.GetUI(Player);
if (UI == Null) continue;
declare netwrite Net_NbRocket for UI = 0;
declare netwrite Net_NbLaser for UI = 0;
declare netwrite Net_NbNucleus for UI = 0;
if (Player.RequestedClan == G_CapturingClan) {
Net_NbRocket = NbRocketAtk;
Net_NbLaser = NbLaserAtk;
Net_NbNucleus = NbNucleusAtk;
} else {
Net_NbRocket = NbRocketDef;
Net_NbLaser = NbLaserDef;
Net_NbNucleus = NbNucleusDef;
}
}
}
foreach (Player in Players) {
if (!C_ForceAtkWeapon) { declare LayerDetached = Layers::Detach("WeaponSelectionAttack", Player.Id); }
if (!C_ForceDefWeapon) { declare LayerDetached = Layers::Detach("WeaponSelectionDefend", Player.Id); }
}
foreach (Spectator in Spectators) {
if (!C_ForceAtkWeapon) { declare LayerDetached = Layers::Detach("WeaponSelectionAttack", Spectator.Id); }
if (!C_ForceDefWeapon) { declare LayerDetached = Layers::Detach("WeaponSelectionDefend", Spectator.Id); }
}
// Sleep a little to let the server receive all the selected weapon
sleep(1000);
}
Code: Select all
declare Boolean G_IsFirstRespawnDef = True; ///< Convenience Bool to avoid lock at first respawn
declare Boolean G_IsFirstRespawnAtk = True; ///< Convenience Bool to avoid lock at first respawn
Code: Select all
/* -------------------------------------- */
/// Update the defenders respawn queue
Void UpdateDefRespawnQueue() {
declare I = 1;
declare ToRemove = Ident[];
declare DefSpawned = False;
foreach (PlayerId in G_DefRespawnQueue) {
if (!Players.existskey(PlayerId)
|| (Players.existskey(PlayerId) && Players[PlayerId].SpawnStatus != CSmPlayer::ESpawnStatus::NotSpawned))
{
ToRemove.add(PlayerId);
continue;
}
declare Player <=> Players[PlayerId];
declare EntranceInQueue for Player = Now;
if (EntranceInQueue + C_RespawnDelay < Now) { // Rajout de condition pour le respawn code du choix d'armes
declare OldArmor for Player = 0;
OldArmor = C_StartingArmor * 100;
declare SpawnDef <=> SM::GetSpawn("SpawnDefense"^G_GoalToCaptureIndex, 0);
if (SpawnDef != Null)
{
SM::SpawnPlayer(Player, Player.RequestedClan, OldArmor, SpawnDef, -1);
}
DefSpawned = True;
ToRemove.add(PlayerId);
// Relaunch weapon selection at respawn
if( G_IsFirstRespawnDef == False )
SelectWeaponsSpawn( Player.id );
}
}
foreach (RemoveId in ToRemove) {
declare Tmp = G_DefRespawnQueue.remove(RemoveId);
}
if (DefSpawned) { declare Tmp = Layers::Update("Respawn", UpdateLayerRespawn()); }
// Convenience Bool to avoid respawn lock at weapons selection
G_IsFirstRespawnDef = False;
}
/* -------------------------------------- */
/// Update the attackers respawn queue
Void UpdateAtkRespawnQueue() {
declare I = 1;
declare ToRemove = Ident[];
declare AtkSpawned = False;
foreach (PlayerId in G_AtkRespawnQueue) {
if (!Players.existskey(PlayerId)
|| (Players.existskey(PlayerId) && Players[PlayerId].SpawnStatus != CSmPlayer::ESpawnStatus::NotSpawned))
{
ToRemove.add(PlayerId);
continue;
}
declare Player <=> Players[PlayerId];
declare EntranceInQueue for Player = Now;
if (EntranceInQueue + C_RespawnDelay < Now) {
declare OldArmor for Player = 0;
OldArmor = C_StartingArmor * 100;
declare SpawnAtk <=> SM::GetSpawn(("SpawnAttack"^G_GoalToCaptureIndex), 0);
if (SpawnAtk != Null)
{
SM::SpawnPlayer(Player, Player.RequestedClan, OldArmor, SpawnAtk, -1);
}
AtkSpawned = True;
ToRemove.add(PlayerId);
// Relaunch weapon selection at respawn
if( G_IsFirstRespawnAtk == False )
SelectWeaponsSpawn( Player.id );
}
}
foreach (RemoveId in ToRemove) {
declare Tmp = G_AtkRespawnQueue.remove(RemoveId);
}
if (AtkSpawned) { declare Tmp = Layers::Update("Respawn", UpdateLayerRespawn()); }
// Convenience Bool to avoid respawn lock at weapons selection
G_IsFirstRespawnAtk = False;
}
Code: Select all
Armor empty event :
/* -------------------------------------- */
// Managing events
foreach (Event in PendingEvents) {
/* -------------------------------------- */
// Armor empty
if (Event.Type == CSmModeEvent::EType::OnArmorEmpty && Event.Victim != Null) {
declare OldArmor for Event.Victim = 0;
OldArmor = 0;
if (Event.Victim.CurrentClan == G_CapturingClan) ArmorsLost += 1;
if (Event.Victim.CurrentClan == 3 - G_CapturingClan) {
// Add victim to the respawn queue
if (C_UseDefRespawnQueue) {
declare EntranceInQueue for Event.Victim = Now;
EntranceInQueue = Now;
G_DefRespawnQueue.add(Event.Victim.Id);
LayerUpdated = Layers::Update("Respawn", UpdateLayerRespawn());
}
} else if (Event.Victim.CurrentClan == G_CapturingClan) {
// Add victim to the respawn queue
if (C_UseAtkRespawnQueue) {
declare EntranceInQueue for Event.Victim = Now;
EntranceInQueue = Now;
G_AtkRespawnQueue.add(Event.Victim.Id);
LayerUpdated = Layers::Update("Respawn", UpdateLayerRespawn());
}
}
SelectWeaponsSpawn(Event.Victim.PlayerId)
LayerUpdated = Layers::Update("ScoresTable", UpdateLayerScoresTable());
PassOn(Event);
}