Page 2 of 3

Re: Mode Territory

Posted: 01 Nov 2012, 17:24
by Bombaklak
Sript mis a jours ! petit soucis de warmup sur la precedente version.

Re: Mode Territory

Posted: 02 Nov 2012, 13:16
by Bombaklak
Un serveur est en ligne avec cette version du script.

Re: Mode Territory

Posted: 02 Nov 2012, 13:25
by lolovainqueur
sur quel serveur ?

Re: Mode Territory

Posted: 02 Nov 2012, 14:24
by crado
lolovainqueur wrote:sur quel serveur ?
+1

Re: Mode Territory

Posted: 02 Nov 2012, 15:58
by Bombaklak
Yop ! Alors c'est sur le serveur |ΔΪΞ| _ƬΞЯRiƬΘRY_

(dsl je capte pas encore trop le coup des manialink pour faire un lien vers un serveur, je m'occuperais de voir ça un peu plus tard)

Re: Mode Territory

Posted: 02 Nov 2012, 16:08
by lolovainqueur
OK il est localisé ou ?

Re: Mode Territory

Posted: 02 Nov 2012, 17:22
by Bombaklak
bretagne

Re: Mode Territory

Posted: 02 Nov 2012, 21:45
by lolovainqueur
J'ai essayé mais j'ai du mal a comprendre --'

Re: Mode Territory

Posted: 03 Nov 2012, 16:59
by Bombaklak
Bon nous somme heureux de vous présenter notre Beta ! Jouable sur notre nouveau serveur
|ΔΪΞ| _ƬΞЯRiƬΘRY_Beta


Les liens on été mis a jours au début du sujet

Re: Mode Territory

Posted: 06 Nov 2012, 23:55
by Bombaklak
Bon alors voici les dernière news, Nous avons trouver comment faire la selection d'arme a chaque respawn mais nous galérons a l'implémentée, dans le sens ou le serveur a besoin d'un "Sleep" (propre de préférence!) Pour avoir le temps d'implémenter les armes. ça crée une impossibilité de capturé le pole durant le temps de selection des armes. ou tout simplement un bon vieu "Run time error' qui relance le warmup....

Nous avonc odé cette fonction qui fonctionne mais nous ne trouvons pas la façon de l'implémenter !


Fonction weapon selection qui fonctionne elle fait bien apparaitre l'UI en fonction de l'id du joueur eliminé

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);
}
Boolean délaré en début de script pour éviter que le premier spawn soit mal ou pas prit en compte. si on rajoute le script a la respawn queue, mais même avec ça si on rajoute la fonction a la respawn queue bha la map reste figée en spec ...

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
Voici le code que nous utilisons pour tenter de rajouter ça a la respawn queue en utilisant les boolean cité au dessus déclarés en debut de scipt.

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;
}
Alors que si on rajoute ça a l'event Armor Empty ça fonctionne mais ça crée pas mal de problèmes. Ou ça relance la partie du a un runtime error lié au "pass on" suite a la première sélection d'arme aprés un respawn (l'UI d'affiche bien le choix est possible) , ou ça bloque la capture du pole durant le temps de selection des armes, sachant que pas mal de joueurs vont surement l'utiliser ça peu pas fonctionner dans l’état.

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);
		
		
	}

Nous avons également des soucis pour implémenter la neutralisation d'un pôle par les défenseurs, si nous arrivons a faire ces 2 ajout ça rajouterais de la profondeur au gameplay. Meme si le mode fonctionne déjà pas trop mal. nous avons fait quelques bonne parties. nous cherchons a amélioré tout ça.

Je tourne en rond, ça vient doucement mais clairement un peu d'aide serait le bienvenue, j'ai un peu l'impression de faire un monologue.