Archives des forums MMO/MMORPG > Neverwinter Nights > NWN - Maskado > [Script] Allez directement en Prison, ne passez pas par la case départ
[Script] Allez directement en Prison, ne passez pas par la case départ
Par Daynos le 12/10/2002 Ã 17:06:34 (#2323253)
Allez directement en Prison, ne passez pas par la case départ
Voici un petit script anti-tueur de NPC
Mieux que de rendre les NPC invincible, mieux que les summons de guardes, mieux que l'instakill du PC qui attaque le NPC.
La Prison !
le but de ce script, est de téléporter le PC attaquant dans une Zone (et de préférence une prison).
Mettez le script suivant dans OnDamaged :
#include "NW_I0_GENERIC"
void main()
{
if (!GetFleeToExit())
{
if (!GetSpawnInCondition (NW_FLAG_SET_WARNINGS))
{
if (!GetIsObjectValid (GetAttemptedAttackTarget ()) && !GetIsObjectValid (GetAttemptedSpellTarget ()))
{
if (GetBehaviorState (NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior (GetLastDamager ());
}
else if (GetIsObjectValid (GetLastDamager ()))
{
DetermineCombatRound ();
if (!GetIsFighting (OBJECT_SELF))
{
object oTarget = GetLastDamager();
if (!GetObjectSeen(oTarget) && GetArea (OBJECT_SELF) == GetArea(oTarget))
{
ActionMoveToLocation (GetLocation (oTarget), TRUE);
ActionDoCommand (DetermineCombatRound ());
}
}
}
}
else if (!GetIsObjectValid (GetAttemptedSpellTarget ()))
{
object oTarget = GetAttackTarget();
object oAttacker = GetLastHostileActor();
if (GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&
(GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||
(GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
{
DetermineCombatRound (oAttacker);
}
}
}
}
if (GetSpawnInCondition (NW_FLAG_DAMAGED_EVENT))
{
SignalEvent (OBJECT_SELF, EventUserDefined (1006));
}
}
object oPC = GetLastAttacker();
if (GetIsPC(oPlayer))
{
SpeakString ("Allez hop, en taule !");
object oTarget = GetWaypointByTag ("wp_taule1");
int iRandom = Random(4);
if (iRandom==1)
{
object oTarget = GetWaypointByTag ("wp_taule1");
}
else if (iRandom==2)
{
object oTarget = GetWaypointByTag ("wp_taule2");
}
else if (iRandom==3)
{
object oTarget = GetWaypointByTag ("wp_taule3");
}
else
{
object oTarget = GetWaypointByTag ("wp_taule4");
}
DelayCommand(5.0, AssignCommand( oPC, JumpToObject( oTarget)));
}
}
C'est le script par défaut de OnDamaged avec la fin mon script de téléportation en prison.
Le random sert uniquement si vous utilisez plusieurs prison (mon but étant de ne jamais savoir où on attérit, ce qui rend difficile son évasion).
Ensuite, débrouillez-vous pour faire une belle prison bien gardée où seule les autres PC pourront aider le pauvre prisonnier.
Je bosse sur une autre version, où le prisonnier se retrouve dépouiller de tout son matos en arrivant en taule. Et en changeant le 'bind' de recall à sa prison.
Shelzard
Par eMRaistlin le 19/10/2002 Ã 23:33:07 (#2366198)
#include "NW_I0_GENERIC"
void main()
{
if (!GetFleeToExit())
{
if (!GetSpawnInCondition (NW_FLAG_SET_WARNINGS))
{
if (!GetIsObjectValid (GetAttemptedAttackTarget ()) && (!GetIsObjectValid (GetAttemptedSpellTarget ())))
{
if (GetBehaviorState (NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior (GetLastDamager ());
}
else if (GetIsObjectValid (GetLastDamager ()))
{
DetermineCombatRound ();
if (!GetIsFighting (OBJECT_SELF))
{
object oTarget = GetLastDamager();
if (!GetObjectSeen(oTarget) && GetArea (OBJECT_SELF) == GetArea(oTarget))
{
ActionMoveToLocation (GetLocation (oTarget), TRUE);
ActionDoCommand (DetermineCombatRound ());
}
}
}
}
else if (!GetIsObjectValid (GetAttemptedSpellTarget ()))
{
object oTarget = GetAttackTarget();
object oAttacker = GetLastHostileActor();
if (GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&(GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||(GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
{
DetermineCombatRound (oAttacker);
}
}
}
}
if (GetSpawnInCondition (NW_FLAG_DAMAGED_EVENT))
{
SignalEvent (OBJECT_SELF, EventUserDefined (1006));
}
object oPC=GetLastAttacker(OBJECT_SELF);
if (GetIsPC(oPC))
{
SpeakString ("Allez hop, en taule !");
object oTarget = GetWaypointByTag ("wp_taule1");
int iRandom = Random(4);
if (iRandom==1)
{
object oTarget = GetWaypointByTag ("wp_taule1");
}
else if (iRandom==2)
{
object oTarget = GetWaypointByTag ("wp_taule2");
}
else if (iRandom==3)
{
object oTarget = GetWaypointByTag ("wp_taule3");
}
else
{
object oTarget = GetWaypointByTag ("wp_taule4");
}
DelayCommand(5.0, AssignCommand( oPC, JumpToObject( oTarget)));
}
}
Par Zariel le 29/10/2002 Ã 0:14:19 (#2428604)
Ou dois-je mettre les "WP_taule" en question, dans la prison ? Sur le PNJ attaqué ?
:aide: J'adore ce script mais il m'a donné du fil à retordre toute la soirée. :sanglote:
Par Zariel le 29/10/2002 Ã 13:00:23 (#2431153)
Emraistlin, tu pourrais me filer un coup de main pour faire tourner ce script s'il te plait ? :rolleyes:
Par eMRaistlin le 29/10/2002 Ã 13:12:31 (#2431247)
Ou dois-je mettre les "WP_taule" en question, dans la prison ? Sur le PNJ attaqué ?
tu cree des waypoints dans la prison...
Pour info : si tu a copier/colle le script directement :
Attention a la casse : il a écrit GetWaypointByTag ("wp_tauleX");
donc tes Waypoints doivent s'appeler wp_tauleX
De plus, si tu ne veux pas 5 waypoint de teleportation, il te suffit de reduire le int iRandom = Random(4); (-1 pour chaque waypoint que tu utilise pas.)
Enfin, il n'estpas prevu que cela empech de tuer des NPC... juste de punir les tueurs...
Par Nylou le 29/10/2002 Ã 13:41:46 (#2431524)
Personnellement je préfère le summon de guardes bien costaud qui arreteront l'agresseur et qui le téléporteront en prison si celui ci ne resiste pas bien sur.
Si l'agresseur du PNJ refuse d'aller en prison, tant pis pour lui. (mort + respawn en prison)
Si le NPC meurt, un grand pretre pourrait venir ressuciter le NPC (à gérer dans le ondeath du NPC).
Par Zariel le 29/10/2002 Ã 14:11:38 (#2431779)
Par LeProctophantasmiste le 29/10/2002 Ã 14:25:20 (#2431908)
#include "NW_I0_GENERIC"
void main()
{
if (!GetFleeToExit())
{
if (!GetSpawnInCondition (NW_FLAG_SET_WARNINGS))
{
if (!GetIsObjectValid (GetAttemptedAttackTarget ()) && (!GetIsObjectValid (GetAttemptedSpellTarget ())))
{
if (GetBehaviorState (NW_FLAG_BEHAVIOR_SPECIAL))
{
DetermineSpecialBehavior (GetLastDamager ());
}
else if (GetIsObjectValid (GetLastDamager ()))
{
DetermineCombatRound ();
if (!GetIsFighting (OBJECT_SELF))
{
object oTarget = GetLastDamager();
if (!GetObjectSeen(oTarget) && GetArea (OBJECT_SELF) == GetArea(oTarget))
{
ActionMoveToLocation (GetLocation (oTarget), TRUE);
ActionDoCommand (DetermineCombatRound ());
}
}
}
}
else if (!GetIsObjectValid (GetAttemptedSpellTarget ()))
{
object oTarget = GetAttackTarget();
object oAttacker = GetLastHostileActor();
if (GetIsObjectValid(oAttacker) && oTarget != oAttacker && GetIsEnemy(oAttacker) &&(GetTotalDamageDealt() > (GetMaxHitPoints(OBJECT_SELF) / 4) ||(GetHitDice(oAttacker) - 2) > GetHitDice(oTarget) ) )
{
DetermineCombatRound (oAttacker);
}
}
}
}
if (GetSpawnInCondition (NW_FLAG_DAMAGED_EVENT))
{
SignalEvent (OBJECT_SELF, EventUserDefined (1006));
}
object oPC=GetLastDamager();
if (GetIsPC(oPC))
{
SpeakString ("Allez hop, en taule !");
object oTarget = GetWaypointByTag ("wp_taule1");
int iRandom = Random(4);
if (iRandom==1)
{
object oTarget = GetWaypointByTag ("wp_taule1");
}
else if (iRandom==2)
{
object oTarget = GetWaypointByTag ("wp_taule2");
}
else if (iRandom==3)
{
object oTarget = GetWaypointByTag ("wp_taule3");
}
else
{
object oTarget = GetWaypointByTag ("wp_taule4");
}
DelayCommand(5.0, AssignCommand( oPC, JumpToObject( oTarget)));
}
}
Pour être tout à fait honnête je me demande même si cela fait quoi que ce soit autrement le lexicon précise que cette fonction ne marchera ( != OBJECT_INVALID) que dans le OnPhysicalAttacked.
Par Zariel le 29/10/2002 Ã 15:06:48 (#2432259)
Par LeProctophantasmiste le 29/10/2002 Ã 15:37:39 (#2432496)
Par Zariel le 29/10/2002 Ã 19:59:05 (#2434981)
Je ne le ferais plus, promis
Par LeProctophantasmiste le 29/10/2002 Ã 20:38:14 (#2435299)
Par Zariel le 30/10/2002 Ã 7:47:43 (#2437667)
Merci bcp.
Par Etienne le 30/10/2002 Ã 8:49:30 (#2437817)
Provient du message de Zariel
c'est pour ca que j'essaie de trouver un moyen de linker les gardes si le script passe à la trappe ;)
A mon avis il te suffira de trouver la position du personnage par la fonction setlocation et ensuite de créer des gardes sur cette même location (dison un garde par nivau du personnage, ça devrait le faire.
Mais je suis au boulot pour l'instant je ne pourrais pas essayer.
Par coolstar le 30/10/2002 Ã 12:35:23 (#2439459)
Par Zariel le 26/12/2002 Ã 11:14:25 (#2880599)
J'utilise les HCR pour les règles sur la mort, pour ceux qui ne connaissent pas, le personnage est téléporté dans une zone dés qu'il meurt et ça jusqu'a la résurrection (si il y a) et si mon joueur essaie de se reconnecter et bien il revient automatiquement dans cette zone (normal, il est mort).
J'aimerai la même chose pour la prison, il est logique qu'un personnage qui s'est mal conduit ne puissent pas ressortir comme un charme de la taule sans caution ou quelque chose. Je ne sais pas par quoi passer pour effectuer cette manoeuvre.
Quelqu'un pourrait m'aider dans cette heureuse période de Noël ou tout le monde s'entraide ? :rolleyes:
allez hop en prison !
Par Jaha Effect le 28/1/2003 Ã 19:24:07 (#3120626)
void main()
{
SetIsDestroyable(FALSE);
object oPC=GetLastKiller();
location lLocation = GetLocation (OBJECT_SELF);
SpeakString ("A LA GARDE !!!");
CreateObject(OBJECT_TYPE_CREATURE, "mage", lLocation , FALSE);
AssignCommand(GetObjectByTag ("Mage"), ActionCastFakeSpellAtObject(SPELL_DOMINATE_PERSON, oPC));
AssignCommand(GetObjectByTag ("Mage"), ApplyEffectToObject(DURATION_TYPE_TEMPORARY, EffectVisualEffect(VFX_FNF_SUMMON_GATE), oPC, 2.0));
AssignCommand(GetObjectByTag ("Mage"), ActionSpeakString ("Vous irez moisire en prison pour ce meurtre"));
int iRandom = d4(1);
DelayCommand (7.0, AssignCommand( oPC, JumpToObject(GetWaypointByTag ("WP_taule"+IntToString(iRandom)))));
DelayCommand (15.0, DestroyObject(GetNearestObjectByTag("Mage")));
DelayCommand (15.0, DestroyObject(OBJECT_SELF));
}
Comme vous pouvez le remarquer ce scripte demande un magos avec pour Tag "Mage" et blueprint "mage" (mais vous pouvez adapter a vos tag et blueprint)
Et 4 waypoint avec les tag suivant
- WP_taule1
- WP_taule2
- WP_taule3
- WP_taule4
Jaha Effect :D
Mon truc a moi (+IntToString ("nananèère..));
Par PesteLaMenace le 29/1/2003 Ã 14:05:31 (#3125622)
Cela simule le fait que quoi qu'on fasse il y aura toujours ou presque des gens pour aller se plaindre, une petite vieille a la fenètre, des gens pour entendre le raffut etc...
A partir d'un certain nombre de pts de crimes les autorités royales (gardes et assimilés) remarqueront le pj et lui demanderont de les suivre a la caserne. Si il vient tant mieux ce sera jugement rp sinon c'est la rixe et finissage en case prison (si il reste un garde debout). Il y a quelques (aura ils ne sont pas encore fait ceux la) chasseurs de tetes qui arpenteront le module a la recherche des gros persos a pts de crimes qui seront donc connu.
La difficultée de ce système est de trouver l'équilibre au niveau des pts de crimes. Par exemple tuer un garde si il y a un autre garde pas loin c'est evidemment prendre suffisemment de pts de crimes pour etre recherché par tous les gardes et les chasseurs de tetes.
Tuer un Noble meme tarif, tuer un cerf ou un vaux-rien dans le bas quartier n'inquietera personne, surtout pas l'autorité royale.....etc..etc...
Je n'ai pas encore testé ce système vu que le module que je prépare est....en préparation mais ce système devrait coller avec des objectifs rp.
Quand aux gardes d'un niveau hallucinant ou des pnjs contre lesquels il est impossible de faire quoi que ce soit je n'aime pas du tout, mais bien sur ca reste mon opinion en accord avec la facon dont je vois les choses, aucunement la bonne ou mauvaise facon de jouer.
Peste.
chitt question?
Par Eltannus le 2/2/2003 Ã 14:48:04 (#3154511)
quand le PJ est téléporter un prison, il faut l'empêcher d'utiliser sa pierre de rappel dans son inventaire.
Coment avez vous résolu ce pb?
Amicalement
Eltannus...in jail
Par Jaha Effect le 2/2/2003 Ã 22:05:12 (#3157288)
void main()
{
object oPC = GetEnteringObject ();
object oPierreadetruire = GetItemPossessedBy (oPC, "NW_IT_RECALL");
if (oPierreadetruire != OBJECT_INVALID)
{
DestroyObject (oPierreadetruire);
}
}
Jaha Effect :D
JOL Archives 1.0.1
@ JOL / JeuxOnLine