[script] Variable pour le "Current checkpoint"

Parlez des avatars, des viseurs, des modèles et des mods ici

Moderator: French Moderator

erkagon
Posts: 13
Joined: 03 Sep 2013, 06:33

[script] Variable pour le "Current checkpoint"

Post by erkagon »

Bonjour,

je cherche la variable qui désigne le numéro du checkpoint courrant, si vous avez une idée s'il-vous-plait ? Pour une ligne du genre : if (Checkpoint.Currentcheckpoint == 1) { gnagnagnagna }

Merci d'avance pour vos réponses,

Erka
User avatar
Eole
Nadeo
Nadeo
Posts: 1265
Joined: 26 Apr 2011, 21:08

Re: [script] Variable pour le "Current checkpoint"

Post by Eole »

Salut,

C'est pour un nouveau mode ou c'est dans un mode existant (Time Attack, Obstacle, ...) ? À quoi correspond "le checkpoint courant"? Il faudrait me donner un peu plus de détails pour que je puisse aider, merci. ;)
Contribute to the ManiaPlanet documentation on GitHub
A question about ManiaScript? Ask it here!
erkagon
Posts: 13
Joined: 03 Sep 2013, 06:33

Re: [script] Variable pour le "Current checkpoint"

Post by erkagon »

C'est pour un nouveau code, ce que je veux dire par "checkpoint courrant" : c'est le dernier checkpoint que le joueur a prit en obstacle. Apparemment ca serait un truc du style : Player.BlockPole.QuelqueChose mais je sais pas quoi, je cherche dans les scripts déjà existant mais je trouve pas.

P.S: Mode de type "Obstacle"
User avatar
Eole
Nadeo
Nadeo
Posts: 1265
Joined: 26 Apr 2011, 21:08

Re: [script] Variable pour le "Current checkpoint"

Post by Eole »

Tu peux essayer quelque chose dans ce style:

Code: Select all

// ---------------------------------- //
// Boucle sur les joueurs pour voir si l'un d'entre eux se trouve sur un checkpoint
foreach (Player in Players) {
  // Création d'un tableau qui sauvegarde l'id des checkpoints déjà activés par un joueur
  declare CheckpointsActivated for Player = Ident[];

  // Si le joueur est spawn 
  // et qu'il est en train de marcher sur un checkpoint
  // et qu'il n'a pas déjà activé ce checkpoint ...
  if (
    Player.SpawnStatus == CSmPlayer::ESpawnStatus::Spawned
    && Player.BlockPole != Null 
    && !CheckpointsActivated.exists(Player.BlockPole.Id)
  ) {
    // ... j'ajoute le checkpoint à la liste des checkpoints activés
    CheckpointsActivated.add(Player.BlockPole.Id);
    // Et je sauvegarde l'id de ce checkpoint pour pouvoir le réutiliser facilement plus tard
    declare LastCheckpointId for Player = Ident;
    LastCheckpointId = Player.BlockPole.Id;
  }
}
Suivant ce que tu essayes de faire il y aura certainement des ajustements, mais la base est là.
Contribute to the ManiaPlanet documentation on GitHub
A question about ManiaScript? Ask it here!
erkagon
Posts: 13
Joined: 03 Sep 2013, 06:33

Re: [script] Variable pour le "Current checkpoint"

Post by erkagon »

Est-ceque je peux écrire :

if(LastCheckpoinId==1) {
NbreRocket=2;
}


en dehors de la boucle foreach ?


edit : je comprend pas la fin de la ligne : declare LastCheckpointId for Player = Ident; c'est quoi "ident" ?
User avatar
Eole
Nadeo
Nadeo
Posts: 1265
Joined: 26 Apr 2011, 21:08

Re: [script] Variable pour le "Current checkpoint"

Post by Eole »

L'ident est un type de variable, au même titre qu'Integer ou Real. Un Ident est un nom unique qui permet d'identifier à coup sur un élément. Donc en récupèrent l'Ident d'un checkpoint, tu peux faire appel à lui pour être sûr de récupérer le bon checkpoint.
La façon dont j'ai écrit ma déclaration de variable peut paraitre confuse effectivement, mais les deux lignes ci-dessous sont équivalentes:

Code: Select all

declare LastCheckpointId for Player = Ident;

declare Ident LastCheckpointId for Player = NullId;
Est-ce que tu peux me dire précisément ce que tu veux faire? À chaque fois que le joueur passe un checkpoint il gagne une rocket supplémentaire? Ou c'est uniquement un checkpoint précis dans la map qui permet de le faire? Est-ce que l'ordre dans lequel le joueur franchi les checkpoints et important ou pas?

Pour résoudre ton problème je pense que le plus simple c'est de créer un MapType custom. Dans ce MapType il faut faire en sorte que le joueur puisse associer un tag spécial aux checkpoints qui changent le nombre de munitions disponibles pour le joueur.
Contribute to the ManiaPlanet documentation on GitHub
A question about ManiaScript? Ask it here!
erkagon
Posts: 13
Joined: 03 Sep 2013, 06:33

Re: [script] Variable pour le "Current checkpoint"

Post by erkagon »

En fait j'ai besoin d'un nombre de rocket pour chaque cp d'une seul et unique map en obstacle donc du coup j'avais pensé faire un truc du style :

Code: Select all

Void ApplyWeaponType(Ident _PlayerId, Integer _Type, Boolean _SendMessage) {
	if (Players.existskey(_PlayerId)) {
		declare Player <=> Players[_PlayerId];
		declare WeaponType for Player = 0;
		declare Integer Nbrerocket;
		// ---------------------------------- //
		// Boucle sur les joueurs pour voir si l'un d'entre eux se trouve sur un checkpoint
		foreach (Player in Players) {
		  // Création d'un tableau qui sauvegarde l'id des checkpoints déjà activés par un joueur
		  declare CheckpointsActivated for Player = Ident[];

		  // Si le joueur est spawn
		  // et qu'il est en train de marcher sur un checkpoint
		  // et qu'il n'a pas déjà activé ce checkpoint ...
		  if (
			Player.SpawnStatus == CSmPlayer::ESpawnStatus::Spawned
			&& Player.BlockPole != Null
			&& !CheckpointsActivated.exists(Player.BlockPole.Id)
		  ) {
			// ... j'ajoute le checkpoint à la liste des checkpoints activés
			CheckpointsActivated.add(Player.BlockPole.Id);
			// Et je sauvegarde l'id de ce checkpoint pour pouvoir le réutiliser facilement plus tard
			declare LastCheckpointId for Player = Ident;
			LastCheckpointId = Player.BlockPole.Id;
		  }
		}
		if (TextLib::SubString(Map.MapName, 0, 7) == "testmap") {
			if (LastCheckpointId == "1") {		
					Nbrerocket = 2;
				}
			if (LastCheckpointId == "2") {		
					Nbrerocket = 3;
				}
				// etc etc ...
		}
		else {
			Nbrerocket = 0;
		}
		
		if (_Type != WeaponType) {
			declare Text UIMessage;
			switch (_Type) {
				case 1: {
					// No ammunition gain
					Player.AmmoGain = 0.0;
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Laser, 0);
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, Nbrerocket);
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Nucleus, 0);
					UIMessage = "no ammu";
				}
				case 2: {
					// Endless ammunition
					Player.AmmoGain = 10.0;
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Laser, 10);
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 10);
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Nucleus, 10);
					UIMessage = "Endless ammunition!";
				}
				default: {
					// Default values
					Player.AmmoGain = 1.0;
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Laser, 1);
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 4);
					SetPlayerAmmoMax(Player, CSmMode::EWeapon::Nucleus, 2);
					UIMessage = "Normal ammunition!";
				}
			}
			WeaponType = _Type;
			if (_SendMessage) {
				declare UI <=> UIManager.GetUI(Player);
				if (UI != Null) {
					UI.StatusMessage = UIMessage;
					declare StatusStopTime for Player = -1;
					StatusStopTime = Now + 4000;
				}
			}
			
			if (C_LogEnabled) {
				MB_Log("""{{{UIMessage}}} for '{{{Player.Login}}}'""");
			}
		}
	}
}
Mais la variable LastCheckpointId contient quoi en fait ? un chiffre, un texte ?
User avatar
Eole
Nadeo
Nadeo
Posts: 1265
Joined: 26 Apr 2011, 21:08

Re: [script] Variable pour le "Current checkpoint"

Post by Eole »

Ok, donc ton mode ce base sur le mode Obstacle de Steeffeen? Dans ce cas tu peux oublier le code que je t'ai donné au début, son script gère déjà tout ça.
Le plus simple c'est de bricoler un peu à partir de ce que propose le MapType d'Obstacle. De base il y a quatre types de checkpoints: "Checkpoint", "CheckpointType1", "CheckpointType2" et "CheckpointType3".
Dans le script du mode en modifiant un peu la fonction ApplyWeaponType() tu devrais pouvoir arriver au résultat que tu désires en bidouillant cette partie:

Code: Select all

    switch (_Type) {
        case 1: {
          // No ammunition gain
          Player.AmmoGain = 0.0;
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Laser, 0);
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 0);
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Nucleus, 0);
          UIMessage = "No ammunition!";
        }
        case 2: {
          // Endless ammunition
          Player.AmmoGain = 10.0;
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Laser, 10);
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 10);
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Nucleus, 10);
          UIMessage = "Endless ammunition!";
        }
        default: {
          // Default values
          Player.AmmoGain = 1.0;
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Laser, 1);
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 4);
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Nucleus, 2);
          UIMessage = "Normal ammunition!";
        }
      }
Si tu remplaces par quelque chose du style:

Code: Select all

    switch (_Type) {
        case 1: {
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 2);
          UIMessage = "2 Ammo max";
        }
        case 2: {
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 3);
          UIMessage = "3 Ammo max";
        }
        case 3: {
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 4);
          UIMessage = "4 Ammo max";
        }
        default: {
          SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, 1);
          UIMessage = "1 Ammo max";
        }
      }
Avec ça tu devrais avoir les bases pour faire ce que tu veux.
Contribute to the ManiaPlanet documentation on GitHub
A question about ManiaScript? Ask it here!
erkagon
Posts: 13
Joined: 03 Sep 2013, 06:33

Re: [script] Variable pour le "Current checkpoint"

Post by erkagon »

c'est déjà la partie que j'étais entrain de modifié c'est pour cela que j'ai mis la variable NbreRocket ici :

Code: Select all

SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, Nbrerocket);
Mais moi ce que je veux faire c'est juste définir manuellement quel checkpoint aura le nombre de rocket que j'ai choisi :

Code: Select all

// Si la map est la map que j'ai choisi
if (TextLib::SubString(Map.MapName, 0, 7) == "testmap") {
                        
                        // Si le numéro du checkpoint est 1
			if (LastCheckpointId == "1") {		
					Nbrerocket = 2;
				}
                        // Si le numéro du checkpoint est 2
			if (LastCheckpointId == "2") {		
					Nbrerocket = 3;
				}
				// etc etc ...
		}
                
else {
      Nbrerocket = 0;
}
c'est pour ca que j'avais besoin d'une variable qui me défini le checkpoint qui à été prit.
User avatar
Eole
Nadeo
Nadeo
Posts: 1265
Joined: 26 Apr 2011, 21:08

Re: [script] Variable pour le "Current checkpoint"

Post by Eole »

Si ton mode ne fonctionne que pour une seule map et aucune autre tu peux essayer de faire ça au début du script:

Code: Select all

/* -------------------------------------- */
// Map start
/* -------------------------------------- */
***StartMap***
***
// ...
declare Counter = 0;
foreach (BlockPole in BlockPoles) {
  Counter += 1;
  declare CheckpointNb for BlockPole = 0;
  if (
    BlockPole.Tag == "Checkpoint"
    || BlockPole.Tag == "CheckpointType1"
    || BlockPole.Tag == "CheckpointType2"
    || BlockPole.Tag == "CheckpointType3"
  ) {
    CheckpointNb = Counter;
  }
}
***
Grâce à ça, chaque checkpoint est associé à un nombre. En revanche tu ne sauras pas à l'avance quel checkpoint correspond à quel nombre. Et ensuite après tu peux utiliser ton code:

Code: Select all

Void ActivateCheckpoint(Ident _PlayerId, Ident _CheckpointId) {
  if (Players.existskey(_PlayerId) && BlockPoles.existskey(_CheckpointId)) {
    declare Player <=> Players[_PlayerId];
    declare BlockPole = BlockPoles[_CheckpointId];

    if (TextLib::SubString(Map.MapName, 0, 7) == "testmap") {
      declare CheckpointNb for BlockPole = 0;
      declare Nbrerocket = 1;
      switch (CheckpointNb) {
        case 1: {
          Nbrerocket = 1;
        }
        case 2: {
          Nbrerocket = 3;
        }
        case 3: {
          Nbrerocket = 1;
        }
        case 4: {
          Nbrerocket = 1;
        }
        // etc ...
      }
      SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, Nbrerocket);
    }
  }

  // Le reste de la fonction ...
}
Contribute to the ManiaPlanet documentation on GitHub
A question about ManiaScript? Ask it here!
Post Reply

Return to “L'Atelier”

Who is online

Users browsing this forum: No registered users and 2 guests