Bijour tout le monde
Désolé j'ai pas eu le temps de le mettre avant ce soir.. bon après le patch 1.06, on a pu créer des pièges. Donc je me suis dit que ce serait pas mal de faire des pièges aléatoires dans les donjons
Donc voilà je me suis rendu compte de plusieurs petites choses
-
SetTrapActive ne fonctionne pas super... je voulais mettre des pièges non actif prédéfinis sur les objet, et le fait qu'ils ne soient pas actif empêche l'ouverture des placeables.... Donc si on peut pas ouvrir ça limite son intérêt
- je suis une quiche je n'arrive pas à trouver un moyen simple et efficace pour séparer les waypoint des objets (y'a la fonction
GetWaypointByTag mais les WP sont pris aussi avec GetObjectByTag donc j'y arrive pas) du coup j'ai séparer en deux...
Le principe :
mettre un trigger (en fait 2 du coup, un pour les objets et l'autre pour les placeables) avec pour tag
TAG_TRIGGER. Ensuite placer des waypoints OU des objets / portes avec pour tag
TAG_TRIGGER1,
TAG_TRIGGER2,
TAG_TRIGGER3,
TAG_TRIGGER4 etc... jusqu'à 9 (amplement suffisant à mon goût)
Sur la zone on peut mettre un variable "trap_chance" qui définie la chance par défaut de voir un piège apparaître (cette variable est la variable générale, on peut la modifier en particulier sur chaque placeable / waypoint / porte)
Ensuite dans le détail :
Si les objets placés sont des WP, un piège au sol apparaîtra comme un carré de 3x3 ... on peut le changer mais moi ça m'a paru correct (en fait j'en sais rien
)
Sur les objets de pièges que l'on place (WP - porte - placeables) on met plusieurs variables :
-
TRAP_TYPE : de 0 à 3, qui correspond à la puissance du piège (de mineur à épique). Les pièges seront pris de façon aléatoire ensuite
- Aucun piège n'est à déclenchement unique, mais on peut le faire en mettant sur les objets à pièges (WP, placeables, portes) la variable
OneShot à TRUE
-
Detect : le DD de détection.
-
Disarm : le DD de désarmement
LES DD :
si vous mettez les variables à -1, le piège sera indetectable / non désarmable
(oué je sais ça doit pas exister dans le dico ... )
Si vous ne mettez rien le DD par défaut du piège sera pris.
Faut mettre les triggers à des passages obligés.
Pendant 15 secondes après le premier passage, le trigger est inactif (ça permet au groupe de passer sans problème
Quand un piège est désamorcé
euh... voilà je pense que c'est tout pour les explications
mais n'hésitez pas pour des améliorations ou autres questions
/* mettre la variable "trap_chance"
Elle définie le pourcentage de chance de voir apparaître un piège
sur la zone elle est prise pour tous les objets / waypoints en général
Sur les objets, waypoints pour un pourcentage particulier
Si rien n'est mis par défaut 60% de chance qu'un piège n'apparaisse
sur le trigger il faut placer une variable WP integer à 1 pour les waypoint.
ne rien mettre pour les placeables
*/
// script à mettre sur le déclencheur
// nom de la bibliothèque. A changer selon les besoins
#include "ktx_trap_inc"
void main()
{
if (GetLocalInt (OBJECT_SELF, "ACTIVE") == TRUE) return;
if (!GetIsPC (GetEnteringObject())) return;
else
{
SetLocalInt (OBJECT_SELF, "ACTIVE", TRUE);
SetLocalInt (GetArea(OBJECT_SELF), GetTag(OBJECT_SELF), TRUE);
string sTag = GetTag (OBJECT_SELF);
int i=1;
int iPourcent = GetLocalInt (GetArea(OBJECT_SELF), "trap_chance");
// pourcentage par défaut à modifier selon les besoins
if (iPourcent == 0) iPourcent = 60;
int iChanceObject;
int iTrap;
int iActiveWP;
int iJet;
int iTrapType;
int iObjectType;
object oTrap;
int iWP = GetLocalInt (OBJECT_SELF, "WP");
if (iWP == 1)
{
oTrap = GetWaypointByTag (sTag + IntToString (i));
while (oTrap != OBJECT_INVALID)
{
iChanceObject = GetLocalInt (oTrap, "trap_chance");
if (iChanceObject != 0) iPourcent = iChanceObject;
//KTXDebug (GetTag (oTrap) + " : pourcentage : " + IntToString (iPourcent));
iActiveWP = GetLocalInt (oTrap, "ACTIVE");
//if (iActiveWP==TRUE) KTXDebug (GetTag (oTrap) + " : déjà activée -- return");
if (iActiveWP==FALSE) // ne peut pas mettre de piège là où il y en a déjà un
{
iJet = d100();
//KTXDebug ("Jet : " + IntToString (iJet));
if (iJet< iPourcent)
{
//KTXDebug (GetTag (oTrap) + " : ACTIVE");
iTrapType = GetLocalInt (oTrap, "TRAP_TYPE");
iTrap = SetRandomTrapType (iTrapType);
KTX_CreateTrapLoc (iTrap, oTrap, TAILLE_PIEGE,(sTag + IntToString (i)) , STANDARD_FACTION_HOSTILE);
}
}
i++;
oTrap = GetWaypointByTag (sTag + IntToString (i));
}
}
else
{
i=1;
oTrap = GetObjectByTag (sTag + IntToString (i));
while (oTrap != OBJECT_INVALID)
{
iChanceObject = GetLocalInt (oTrap, "trap_chance");
if (iChanceObject != 0) iPourcent = iChanceObject;
//KTXDebug (GetTag (oTrap) + " (plac) : pourcentage : " + IntToString (iPourcent));
iActiveWP = GetLocalInt (oTrap, "ACTIVE");
//if (iActiveWP==TRUE) KTXDebug (GetTag (oTrap) + " (plac) : déjà activée -- return");
if (iActiveWP==FALSE) // ne peut pas mettre de piège là où il y en a déjà un
{
iJet = d100();
//KTXDebug ("Jet : " + IntToString (iJet));
if (iJet< iPourcent)
{
//KTXDebug (GetTag (oTrap) + " (plac) : ACTIVE");
iTrapType = GetLocalInt (oTrap, "TRAP_TYPE");
iTrap = SetRandomTrapType (iTrapType);
KTX_CreateTrapObject (iTrap, oTrap, STANDARD_FACTION_HOSTILE);
}
}
i++;
oTrap = GetObjectByTag (sTag + IntToString (i));
}
}
DelayCommand (15.0f, SetLocalInt (OBJECT_SELF, "ACTIVE", FALSE));
}
}
const string sScript = "ktx_trap_rearm"; // script à mettre sur le OnDisarm
const float TAILLE_PIEGE = 3.0f ;// changer pour la taille des pièges au sol
// fonction inutile
//void SauvegardePiege (object oPiege, object oWP);
// cette fonction permet de mettre à jour les propriétés de la trap
// mettre sur les waypoints 2 variables INTEGER : Disarm et Detect
// si Detect est à 0, il est impossible de détecter le piège
// si Disarm est à 0, il est impossible de Désarmer le piège
// optionnel : mettre OneShot à 1 pour que le piège soit à déclenchement unique
void SetPiege(object oPiege, object oWP);
// crée un piège sur un placeabe ou une porte
void KTX_CreateTrapObject (int iTrap, object oObject, int iFaction);
// créer un piège à l'endroit du waypoint
void KTX_CreateTrapLoc (int iTrap, object oWP, float fsize, string sTag, int iFaction);
// fonction de débuggage
// du coup elle sert plus :)
//void KTXDebug (string stxt);
// mettre sur le WP la variable int TRAP_TYPE
// 0 : piège léger
// 1 : piège moyen
// 2 : piège difficile
// 1 : piège épique
int SetRandomTrapType (int average);
/*
// fonction non utilisée.. je voulais sauvegarder le piège par cession de reboot
// du serveur et les remettre mais bon c'est pas si intéressant que ça au final
void SauvegardePiege (object oPiege, object oWP)
{
int iTrap = GetTrapBaseType(oPiege);
int iCanDetect = GetTrapDetectable (oPiege);
int iDetectDC = GetTrapDetectDC (oPiege);
int iCanDisarm = GetTrapDisarmable (oPiege);
int iDisarmDC = GetTrapDisarmDC (oPiege);
int iOneShot = GetTrapOneShot(oPiege);
SetLocalInt (oWP, "TrapType",iTrap);
SetLocalInt (oWP, "CanDetect",iCanDetect);
SetLocalInt (oWP, "DetectDC",iDetectDC);
SetLocalInt (oWP, "CanDisarm",iCanDisarm);
SetLocalInt (oWP, "DisarmDC",iDisarmDC);
SetLocalInt (oWP, "OneShot",iOneShot);
}
*/
void SetPiege(object oPiege, object oWP)
{
int iDetectDC = GetLocalInt (oWP, "Detect");
int iDisarmDC = GetLocalInt (oWP, "Disarm");
int iOneShot = GetLocalInt (oWP, "OneShot");
if (iDetectDC != -1)
{
SetTrapDetectable (oPiege, TRUE);
if (iDetectDC != 0)SetTrapDetectDC (oPiege, iDetectDC);
}
else SetTrapDetectable (oPiege, FALSE);
//KTXDebug (GetTag(oPiege) + " DetectDC : " + IntToString (iDetectDC));
if (iDisarmDC != -1)
{
SetTrapDisarmable (oPiege, TRUE);
if (iDisarmDC != 0) SetTrapDisarmDC (oPiege, iDisarmDC);
//KTXDebug ("DisarmDC = " + IntToString (GetTrapDisarmDC (oPiege)));
}
else SetTrapDisarmDC (oPiege, FALSE);
SetTrapOneShot (oPiege, iOneShot);
}
void KTX_CreateTrapObject (int iTrap, object oObject, int iFaction)
{
CreateTrapOnObject (iTrap, oObject , iFaction, sScript);
SetPiege (oObject, oObject);
SetTrapActive (oObject, TRUE);
}
void KTX_CreateTrapLoc (int iTrap, object oWP, float fsize, string sTag, int iFaction)
{
location lLoc = GetLocation (oWP);
object oTrapCreate = CreateTrapAtLocation (iTrap, lLoc, fsize, sTag, iFaction, sScript);
SetPiege (oTrapCreate, oWP);
}
/*
void KTXDebug (string stxt)
{
SendMessageToPC (GetFirstPC(), stxt);
}
*/
int SetRandomTrapType (int iType)
{
int iRandom;
int iTrap;
if (iType == 0)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_MINOR_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_MINOR_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_MINOR_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_MINOR_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_MINOR_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_MINOR_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_MINOR_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_MINOR_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_MINOR_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_MINOR_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_MINOR_TANGLE; break;
}
}
else if (iType == 1)
{iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_AVERAGE_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_AVERAGE_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_AVERAGE_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_AVERAGE_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_AVERAGE_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_AVERAGE_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_AVERAGE_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_AVERAGE_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_AVERAGE_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_AVERAGE_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_AVERAGE_TANGLE; break;
}
}
else if (iType == 2)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_STRONG_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_STRONG_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_STRONG_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_STRONG_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_STRONG_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_STRONG_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_STRONG_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_STRONG_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_STRONG_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_STRONG_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_STRONG_TANGLE; break;
}
}
else if (iType == 3)
{
iRandom = Random (11);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_DEADLY_ACID; break;
case 1 : iTrap = TRAP_BASE_TYPE_DEADLY_ACID_SPLASH; break;
case 2 : iTrap = TRAP_BASE_TYPE_DEADLY_ELECTRICAL; break;
case 3 : iTrap = TRAP_BASE_TYPE_DEADLY_FIRE; break;
case 4 : iTrap = TRAP_BASE_TYPE_DEADLY_FROST; break;
case 5 : iTrap = TRAP_BASE_TYPE_DEADLY_GAS; break;
case 6 : iTrap = TRAP_BASE_TYPE_DEADLY_HOLY; break;
case 7 : iTrap = TRAP_BASE_TYPE_DEADLY_NEGATIVE; break;
case 8 : iTrap = TRAP_BASE_TYPE_DEADLY_SONIC; break;
case 9 : iTrap = TRAP_BASE_TYPE_DEADLY_SPIKE; break;
case 10 : iTrap = TRAP_BASE_TYPE_DEADLY_TANGLE; break;
}
}
else if (iType == 4)
{
iRandom = Random (4);
switch (iRandom)
{
case 0 : iTrap = TRAP_BASE_TYPE_EPIC_ELECTRICAL; break;
case 1 : iTrap = TRAP_BASE_TYPE_EPIC_FIRE; break;
case 2 : iTrap = TRAP_BASE_TYPE_EPIC_FROST; break;
case 3 : iTrap = TRAP_BASE_TYPE_EPIC_SONIC; break;
}
}
return iTrap;
}
// ce script sert à "réarmer" la zone. Elle a été touchée donc les pièges pourront
// être remis
#include "ktx_trap_inc"
void main ()
{
string sTag=GetTag(OBJECT_SELF);
object oWP = GetWaypointByTag (sTag);
//SauvegardePiege (OBJECT_SELF, oWP);
SetLocalInt (oWP, "ACTIVE", FALSE);
string sTagBase = GetStringLeft (GetTag(OBJECT_SELF), (GetStringLength(GetTag(OBJECT_SELF))-1));
SetLocalInt (GetArea(OBJECT_SELF), sTagBase, FALSE);
}