Aller au contenu


[résolu] Problème De Téléportation


  • Veuillez vous connecter pour répondre
4 réponses à ce sujet

#1 beeratwork

beeratwork

Posté 31 août 2009 - 09:30

Bonjour ça fait un bail que je ne suis plus passé, et je sais que je pose toujours des colles, alors en voilà une nouvelle !

Quelqu'un sait-il me dire pourquoi ce script provoque un chargement, alors qu'il ne devrait pas y en avoir, lorsque le démon (AARDemonicusRefDemon) apparaît dans la cité impériale au quartier du marché et qu'il est tué ??? Quand le temps de chargement est fini, le jeu bug.
Il n'y a pas de problème lorsque le démon ne meurt pas et qu'on est en extérieur (devant vilverin par exemple)...

Script de l'épée qui fait appparaître le démon :

 

ScriptName AARDemonicus04Script

; script sur objet

float timer
short catch
short Equiped
short DoOnce
short level
short OnPlay0
short nbrOld3
short warning
short step
short OnHorse
ref Self

Begin OnAdd player
if (catch == 0)
  set Self to GetSelf
  set nbrOld3 to player.GetItemCount AARDemonicus03
  if (nbrOld3 != 0)
   Message " "
   Message " "
   player.UnequipItem AARDemonicus03 1
   Message " "
   Message " "
   player.RemoveItem AARDemonicus03 nbrOld3
  endif
  Message " "
  Message " "
  player.EquipItem AARDemonicus04 1
  set catch to 1
endif
End

Begin GameMode
; Apparition du démon
if (catch == 1)
  set timer to 120
  set catch to 2
elseif (catch == 2)
; Pas de contrôle
  TriggerHitShader 50
  DisablePlayerControls 1
; Fantôme
  player.SetGhost 1
  player.AddSpell AARDemonicusSpellDemonInvisibility
; Démon
  AARDemonicusRefDemon.Enable
  AARDemonicusRefDemon.Resurrect
  AARDemonicusRefDemon.AddItem AARDemonicus04SelfDisable 1
  AARDemonicusRefDemon.MoveTo player
; Sort
  AARDemonicusRefDemon.Cast AARDemonicusSpellDemonRise00 player
  set catch to 3
elseif (catch == 3)
  if (timer > 0)
   set timer to (timer - GetSecondsPassed)
   if (AARDemonicusRefDemon.GetDistance player > 512 && catch == 3)
	player.MoveTo AARDemonicusRefDemon
   endif
  else
   set catch to 4
  endif 
elseif (catch == 4)
; Démon
  AARDemonicusRefDemon.RemoveItem AARDemonicus04SelfDisable 1
  AARDemonicusRefDemon.Disable
  AARDemonicusRefDemon.MoveTo AARDemonicusRefMarkBase
; Contrôle 
  EnablePlayerControls 1
; Normal
  player.SetGhost 0
  player.RemoveSpell AARDemonicusSpellDemonInvisibility
; Arrêter de suivre
  set catch to 5
  SetStage AARDemonicusQuestDemonicus00 25
  StartQuest AARDemonicusQuestNoDemon00
endif
  
; Savoir si le joueur est équipé de l'arme
if (player.GetEquipped AARDemonicus04 == 1)
  set Equiped to 1
  set AARDemonicusGlobalEquiped04 to 1
elseif (player.GetEquipped AARDemonicus04 == 0)
  set Equiped to 0
  set AARDemonicusGlobalEquiped04 to 0
endif

; Si le joueur est équipé
if (Equiped == 1)
  if (DoOnce == 0)
   Message " "
   Message " "
   player.AddSpell AARDemonicusSpell00Resurrect
   Message " "
   Message " "
   player.AddSpell AARDemonicusSpell01BreakArmor
   Message " "
   Message " "
   player.AddSpell AARDemonicusSpell02HealthUp
   Message " "
   Message " "
   player.AddSpell AARDemonicusSpell03Boost04
   Message " "
   Message " "
   player.AddSpell AARDemonicusSpell05Hilt
   set DoOnce to 1
  elseif (DoOnce == 1 && warning == 0)
   if (player.GetActorValue fatigue <= ((15/100) * (player.GetBaseActorValue fatigue)))
	Message " "
	Message " "
	player.AddSpell AARDemonicusSpell04Drain04
	Message " "
	Message " "
	player.RemoveSpell AARDemonicusSpell03Boost04
	set warning to 1
   endif
  endif
; Si le joueur n'est pas équipé
elseif (Equiped == 0)
  if (DoOnce == 1)
   Message " "
   Message " "
   player.RemoveSpell AARDemonicusSpell00Resurrect
   Message " "
   Message " "
   player.RemoveSpell AARDemonicusSpell01BreakArmor
   Message " "
   Message " "
   player.RemoveSpell AARDemonicusSpell02HealthUp
   Message " "
   Message " "
   player.RemoveSpell AARDemonicusSpell05Hilt
   if (warning == 0)
	Message " "
	Message " "
	player.RemoveSpell AARDemonicusSpell03Boost04
   elseif (warning == 1)
	Message " "
	Message " "
	player.RemoveSpell AARDemonicusSpell04Drain04
	set warning to 0
   endif
   set DoOnce to 0
  endif
endif

; Update des dégâts
if (AARDemonicusGlobalKill04 == 25)
  ModAttackDamage 1 Self
elseif (AARDemonicusGlobalKill04 == 50)
  ModAttackDamage 2 Self
elseif (AARDemonicusGlobalKill04 == 75)
  ModAttackDamage 3 Self
endif

; Evolution vers le niveau suivant
  set OnPlay0 to player.GetItemCount AARDemonicus04
  if (OnPlay0 != 0)
   if (AARDemonicusGlobalKill04 >= 100 && AARDemonicusGlobalCountSpell00Resurrect >= 3 && AARDemonicusGlobalCountSpell01BreakArmor >= 3 && AARDemonicusGlobalCountSpell02HealthUp >= 3 && catch == 5 && level == 0)
	set level to 1
   endif
  endif
  if (level == 1)
   if (step == 0)
	set timer to 15
	set step to 1
   elseif (step == 1)
	if (timer > 0)
	 set timer to timer - GetSecondsPassed
	else
	 set step to 2
	endif
   elseif (step == 2)
	if (OnPlay0 != 0)
	 if (player.IsRidingHorse == 1)
	  set OnHorse to 1
	 elseif (player.IsRidingHorse == 0)
	  if (OnHorse == 0)
	   Message " "
	   Message " "
	   player.AddItem AARDemonicus05 1
	   set level to 2
	  elseif (OnHorse == 1)
	   set timer to 2
	   set OnHorse to 2
	  elseif (OnHorse == 2)
	   if (timer > 0)
		set timer to timer - GetSecondsPassed
	   else
		set OnHorse to 0
	   endif
	  endif
	 endif
	endif
   endif
  endif
End

Script sur le démon :
 

scn AARDemonicusRefDemon00Script

short MustMute
short levelPlayer
short strengthPlayer
short intelligencePlayer
short willpowerPlayer
short agilityPlayer
short speedPlayer
short endurancePlayer
short luckPlayer
short personalityPlayer
short armorerPlayer
short athleticsPlayer
short bladePlayer
short blockPlayer
short bluntPlayer
short handtohandPlayer
short heavyarmorPlayer
short alchemyPlayer
short alterationPlayer
short conjurationPlayer
short destructionPlayer
short illusionPlayer
short mysticismPlayer
short restorationPlayer
short acrobaticsPlayer
short lightarmorPlayer
short marksmanPlayer
short mercantilePlayer
short securityPlayer
short sneakPlayer
short speechcraftPlayer

Begin OnDeath
if (GetStage AARDemonicusQuestMain00 == 17)
  set AARDemonicusGlobalDemonAttack to 0
  Resurrect
  MoveTo player 1 0 0
  SetStage AARDemonicusQuestMain00 18
; Course contre la montre perdue
elseif (GetStage AARDemonicusQuestNoDemon00 == 50)
  set AARDemonicusGlobalDemonAttack to 0
  Disable
  Player.MoveTo AARDemonicusRefMarkRoom
  SetStage AARDemonicusQuestNoDemon00 55
; Nombre insuffisant de fantôme
elseif (GetStage AARDemonicusQuestNoDemon00 == 70)
  set AARDemonicusGlobalDemonAttack to 0
  Disable
  Player.MoveTo AARDemonicusRefMarkRoom
  if (AARDemonicusGlobalHolyWater00 > 1)
   if (player.GetItemCount AARDemonicus04 > 0)
	player.UnequipItem AARDemonicus04 1
	player.RemoveItem AARDemonicus04 1
   elseif (player.GetItemCount AARDemonicus05 > 0)
	player.UnequipItem AARDemonicus05 1
	player.RemoveItem AARDemonicus05 1
   elseif (player.GetItemCount AARDemonicus06 > 0)
	player.UnequipItem AARDemonicus06 1
	player.RemoveItem AARDemonicus06 1
   endif
   SetStage AARDemonicusQuestNoDemon00 75
  else
   SetStage AARDemonicusQuestNoDemon00 80
  endif
; Nombre suffisant de fantôme que pour avoir l'épée
elseif (GetStage AARDemonicusQuestNoDemon00 == 90)
  set AARDemonicusGlobalDemonAttack to 0
  Disable
  Player.MoveTo AARDemonicusRefMarkRoom
  if (AARDemonicusGlobalHolyWater00 > 1)
   if (player.GetItemCount AARDemonicus04 > 0)
	player.UnequipItem AARDemonicus04 1
	player.RemoveItem AARDemonicus04 1
   elseif (player.GetItemCount AARDemonicus05 > 0)
	player.UnequipItem AARDemonicus05 1
	player.RemoveItem AARDemonicus05 1
   elseif (player.GetItemCount AARDemonicus06 > 0)
	player.UnequipItem AARDemonicus06 1
	player.RemoveItem AARDemonicus06 1
   endif
   player.AddItem AARDemonicus07 1
   SetStage AARDemonicusQuestNoDemon00 95
  else
   SetStage AARDemonicusQuestNoDemon00 100
  endif
; Pas pendant stage de quête
else
  set AARDemonicusGlobalDemonAttack to 0
  MoveTo AARDemonicusRefMarkBase
  Disable
endif
End

Begin OnStartCombat player
if (AARDemonicusGlobalDemonAttack == 0)
  AARDemonicusRefDemon.StopCombat player
endif
End

Begin GameMode
; Evolution ou non ?
if (AARDemonicusRefDemon.GetLevel < (player.GetLevel + 10))
  set MustMute to 1
endif

; Evolution
if (MustMute == 1)
  set MustMute to 0
; Niveau du démon 
  set levelPlayer to (player.GetLevel + 10)
  AARDemonicusRefDemon.SetLevel levelPlayer
; Stat du démon
  set strengthPlayer to (player.GetActorValue strength + 10)
  set intelligencePlayer to (player.GetActorValue intelligence + 10)
  set willpowerPlayer to (player.GetActorValue willpower + 10)
  set agilityPlayer to (player.GetActorValue agility + 10)
  set speedPlayer  to (player.GetActorValue speed + 10)
  set endurancePlayer to (player.GetActorValue endurance + 10)
  set luckPlayer  to (player.GetActorValue luck + 10)
  set personalityPlayer to (player.GetActorValue personality + 10)
  set armorerPlayer to (player.GetActorValue armorer + 10)
  set athleticsPlayer to (player.GetActorValue athletics + 10)
  set bladePlayer  to (player.GetActorValue blade + 10)
  set blockPlayer  to (player.GetActorValue block + 10)
  set bluntPlayer  to (player.GetActorValue blunt + 10)
  set handtohandPlayer to (player.GetActorValue handtohand + 10)
  set heavyarmorPlayer to (player.GetActorValue heavyarmor + 10)
  set alchemyPlayer to (player.GetActorValue alchemy + 10)
  set alterationPlayer to (player.GetActorValue alteration + 10)
  set conjurationPlayer to (player.GetActorValue conjuration + 10)
  set destructionPlayer to (player.GetActorValue destruction + 10)
  set illusionPlayer to (player.GetActorValue illusion + 10)
  set mysticismPlayer to (player.GetActorValue mysticism + 10)
  set restorationPlayer to (player.GetActorValue restoration + 10)
  set acrobaticsPlayer to (player.GetActorValue acrobatics + 10)
  set lightarmorPlayer to (player.GetActorValue lightarmor + 10)
  set marksmanPlayer to (player.GetActorValue marksman + 10)
  set mercantilePlayer to (player.GetActorValue mercantile + 10)
  set securityPlayer to (player.GetActorValue security + 10)
  set sneakPlayer  to (player.GetActorValue sneak + 10)
  set speechcraftPlayer to (player.GetActorValue speechcraft + 10)
  AARDemonicusRefDemon.SetActorValue strength strengthPlayer
  AARDemonicusRefDemon.SetActorValue intelligence intelligencePlayer
  AARDemonicusRefDemon.SetActorValue willpower willpowerPlayer
  AARDemonicusRefDemon.SetActorValue agility agilityPlayer
  AARDemonicusRefDemon.SetActorValue speed speedPlayer
  AARDemonicusRefDemon.SetActorValue endurance endurancePlayer
  AARDemonicusRefDemon.SetActorValue luck  luckPlayer
  AARDemonicusRefDemon.SetActorValue personality personalityPlayer
  AARDemonicusRefDemon.SetActorValue armorer armorerPlayer
  AARDemonicusRefDemon.SetActorValue athletics athleticsPlayer
  AARDemonicusRefDemon.SetActorValue blade bladePlayer
  AARDemonicusRefDemon.SetActorValue block blockPlayer
  AARDemonicusRefDemon.SetActorValue blunt bluntPlayer
  AARDemonicusRefDemon.SetActorValue handtohand handtohandPlayer
  AARDemonicusRefDemon.SetActorValue heavyarmor heavyarmorPlayer
  AARDemonicusRefDemon.SetActorValue alchemy alchemyPlayer
  AARDemonicusRefDemon.SetActorValue alteration alterationPlayer
  AARDemonicusRefDemon.SetActorValue conjuration conjurationPlayer
  AARDemonicusRefDemon.SetActorValue destruction destructionPlayer
  AARDemonicusRefDemon.SetActorValue illusion illusionPlayer
  AARDemonicusRefDemon.SetActorValue mysticism mysticismPlayer
  AARDemonicusRefDemon.SetActorValue restoration restorationPlayer
  AARDemonicusRefDemon.SetActorValue acrobatics acrobaticsPlayer
  AARDemonicusRefDemon.SetActorValue lightarmor lightarmorPlayer
  AARDemonicusRefDemon.SetActorValue marksman marksmanPlayer
  AARDemonicusRefDemon.SetActorValue mercantile mercantilePlayer
  AARDemonicusRefDemon.SetActorValue security securityPlayer
  AARDemonicusRefDemon.SetActorValue sneak sneakPlayer
  AARDemonicusRefDemon.SetActorValue speechcraft speechcraftPlayer
endif
End

Modifié par beeratwork, 03 septembre 2009 - 19:27.


#2 Shadow she-wolf

Shadow she-wolf

    Le katana de la GBT


Posté 31 août 2009 - 13:48

Bonjour,

Si j'ai bien compris:
Lorsque le démon meurt, il y a un écran de chargement et à la fin, le jeu plante ?
Alors que normalement il ne devrait pas y avoir de chargement, c'est cela ?


Pourtant, si je regarde le bloc OnDeath du script du démon, je vois plusieurs "Player.MoveTo AARDemonicusRefMarkRoom", je ne sais pas où est ce marqueur, mais quoi qu'il en soit, le PJ y est envoyé, et donc si le joueur ne se trouve pas dans la même cellule que le marqueur, le jeu doit bien charger cette cellule. :wacko:

La fonction MoveTo n'ayant pas de problème particulier sur le joueur, c'est qu'il doit y avoir un truc qui fait planter le jeu dans la cellule où il est envoyé.


Par ailleurs, un petit détail sans grande importance, dans le script AARDemonicus04Script, au test des lignes 57-65:
elseif (catch == 3)
  if (timer > 0)
   set timer to (timer - GetSecondsPassed)
   if (AARDemonicusRefDemon.GetDistance player > 512[color="#ff0000"] && catch == 3[/color])
	player.MoveTo AARDemonicusRefDemon
   endif
  else
   set catch to 4
  endif
Le test en rouge ne sert strictement à rien puisque cette condition a déjà été testée juste avant. :dry:

#3 beeratwork

beeratwork

Posté 31 août 2009 - 14:42

Oui, je sais qu'il y a plusieur player.moveto, mais le bug se fait avant le "SetStage AARDemonicusQuestDemonicus00 25" (script de l'épée) puisque je voit l'écran de chargement et pas d'alerte de quête juste avant...

Et les player.moveto dans le script du démon se font

if (GetStage AARDemonicusQuestMain00 == 17)
  set AARDemonicusGlobalDemonAttack to 0
  Resurrect
  MoveTo player 1 0 0
  SetStage AARDemonicusQuestMain00 18
; Course contre la montre perdue
Ca ne se fait qu'une seule fois et correctement.

elseif (GetStage AARDemonicusQuestNoDemon00 == 50)
  set AARDemonicusGlobalDemonAttack to 0
  Disable
  Player.MoveTo AARDemonicusRefMarkRoom
  SetStage AARDemonicusQuestNoDemon00 55
; Nombre insuffisant de fantôme
elseif (GetStage AARDemonicusQuestNoDemon00 == 70)
  set AARDemonicusGlobalDemonAttack to 0
  Disable
  Player.MoveTo AARDemonicusRefMarkRoom
  if (AARDemonicusGlobalHolyWater00 > 1)
   if (player.GetItemCount AARDemonicus04 > 0)
	player.UnequipItem AARDemonicus04 1
	player.RemoveItem AARDemonicus04 1
   elseif (player.GetItemCount AARDemonicus05 > 0)
	player.UnequipItem AARDemonicus05 1
	player.RemoveItem AARDemonicus05 1
   elseif (player.GetItemCount AARDemonicus06 > 0)
	player.UnequipItem AARDemonicus06 1
	player.RemoveItem AARDemonicus06 1
   endif
   SetStage AARDemonicusQuestNoDemon00 75
  else
   SetStage AARDemonicusQuestNoDemon00 80
  endif
; Nombre suffisant de fantôme que pour avoir l'épée
elseif (GetStage AARDemonicusQuestNoDemon00 == 90)
  set AARDemonicusGlobalDemonAttack to 0
  Disable
  Player.MoveTo AARDemonicusRefMarkRoom
  if (AARDemonicusGlobalHolyWater00 > 1)
   if (player.GetItemCount AARDemonicus04 > 0)
	player.UnequipItem AARDemonicus04 1
	player.RemoveItem AARDemonicus04 1
   elseif (player.GetItemCount AARDemonicus05 > 0)
	player.UnequipItem AARDemonicus05 1
	player.RemoveItem AARDemonicus05 1
   elseif (player.GetItemCount AARDemonicus06 > 0)
	player.UnequipItem AARDemonicus06 1
	player.RemoveItem AARDemonicus06 1
   endif
   player.AddItem AARDemonicus07 1
   SetStage AARDemonicusQuestNoDemon00 95
  else
   SetStage AARDemonicusQuestNoDemon00 100
  endif
Ne se fait pas encore puisque  le "SetStage AARDemonicusQuestDemonicus00 25" ne se fait pas.

; Pas pendant stage de quête
else
  set AARDemonicusGlobalDemonAttack to 0
  MoveTo AARDemonicusRefMarkBase
  Disable
endif
End
Alors là je me dit maintenant => lorsque le démon meurt, je le téléporte... mais le chargement n'est censé se faire que pour le joueur ??? Je pense maintenant à ceci :
   if (AARDemonicusRefDemon.GetDistance player > 512 && catch == 3)
	player.MoveTo AARDemonicusRefDemon
   endif
Lorsque le démon meurt, il est téléporté, donc il est à plus grande distance du jouer, donc on envoie le joueur le rejoindre... je vais seter une variable lorsque le démon meurt et la reseter lorsque je l'appelle... ça me servira de verrou...si ça marche...mon petit catch == 3, je crois que j'ai eu du mal avaler le bug...

Merci !!!

#4 Shadow she-wolf

Shadow she-wolf

    Le katana de la GBT


Posté 31 août 2009 - 15:12

Ah oui.
Car le Timer a été mit à 120, or tant qu'il n'est pas à zéro, il reste bloquer dans la boucle rouge ici:

elseif (catch == 3)
  [color="#ff0000"]if (timer > 0)
   set timer to (timer - GetSecondsPassed)
	if (AARDemonicusRefDemon.GetDistance player > 512 && catch == 3)
	  player.MoveTo AARDemonicusRefDemon
	endif[/color]
  else
   set catch to 4
  endif

Du coup, comme tu le dis, si le démon meurt avant la fin de ces 120 secondes, le joueur le suivra partout où ira le démon...

#5 beeratwork

beeratwork

Posté 31 août 2009 - 18:16

Shadow she-wolf, merci beaucoup ! Tu as mis le doigt sur le problème ! Ca marche en remplaçant le "catch" par la bonne variable....


Shadow she-wolf, encore merci !

Pour ceux qui liraient ce sujet :

Je lançais un timer, pendant le décompte, si le joueur était trop loin, je le téléportais près du démon. Oui mais une fois le démon mort avant la fin du timer, crack ! Car le démon était téléporté à sa mort automatiquement, et désactivé... Donc la solution : si le démon est mort alors on set une variable et on vérifie pendant le décompte du timer l'état de cette variable....

Modifié par beeratwork, 03 septembre 2009 - 19:31.





0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)