[script] Variable pour le "Current checkpoint"
Moderator: French Moderator
[script] Variable pour le "Current checkpoint"
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
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
Re: [script] Variable pour le "Current checkpoint"
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.
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.

Re: [script] Variable pour le "Current checkpoint"
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"
P.S: Mode de type "Obstacle"
Re: [script] Variable pour le "Current checkpoint"
Tu peux essayer quelque chose dans ce style:
Suivant ce que tu essayes de faire il y aura certainement des ajustements, mais la base est là .
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;
}
}
Re: [script] Variable pour le "Current checkpoint"
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" ?
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" ?
Re: [script] Variable pour le "Current checkpoint"
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:
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.
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;
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.
Re: [script] Variable pour le "Current checkpoint"
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 :
Mais la variable LastCheckpointId contient quoi en fait ? un chiffre, un texte ?
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}}}'""");
}
}
}
}
Re: [script] Variable pour le "Current checkpoint"
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:
Si tu remplaces par quelque chose du style:
Avec ça tu devrais avoir les bases pour faire ce que tu veux.
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!";
}
}
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";
}
}
Re: [script] Variable pour le "Current checkpoint"
c'est déjà la partie que j'étais entrain de modifié c'est pour cela que j'ai mis la variable NbreRocket ici :
Mais moi ce que je veux faire c'est juste définir manuellement quel checkpoint aura le nombre de rocket que j'ai choisi :
c'est pour ca que j'avais besoin d'une variable qui me défini le checkpoint qui à été prit.
Code: Select all
SetPlayerAmmoMax(Player, CSmMode::EWeapon::Rocket, Nbrerocket);
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;
}
Re: [script] Variable pour le "Current checkpoint"
Si ton mode ne fonctionne que pour une seule map et aucune autre tu peux essayer de faire ça au début du script:
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
/* -------------------------------------- */
// 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;
}
}
***
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 ...
}
Who is online
Users browsing this forum: No registered users and 2 guests