[Modding] Wie kann man dieses Problem mit dem Scripting lösen ?

Dark Enchanter

Senior Member
Registriert
11.05.2013
Beiträge
126
Hallo :)

Ich habe hier ein kleines Script -->

Code:
IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
    	StateCheck(Myself,STATE_SLOWED)
	HasItem("potn14",Myself) // Schnelligkeitsöl
THEN
    	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn14",Myself) // Schnelligkeitsöl
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
    	StateCheck(Myself,STATE_POISONED)
	HasItem("potn17",Myself) // Heilungselixier
THEN
    	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn17",Myself) // Heilungselixier
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
    	StateCheck(Myself,STATE_POISONED)
	HasItem("potn20",Myself) // Gegengift
THEN
    	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn20",Myself) // Gegengift
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,50)
	HasItem("potn55",Myself) // Extrastarker Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn55",Myself) // Extrastarker Heiltrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,65)
	HasItem("potn52",Myself) // Konzentrierter Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn52",Myself) // Konzentrierter Heiltrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,80)
	HasItem("potn08",Myself) // Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn08",Myself) // Heiltrank
END

IF
	InWeaponRange(NearestEnemyOf(Myself))
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(NearestEnemyOf(Myself))
END

IF
	AttackedBy([ANYONE],DEFAULT)
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(LastAttackerOf(Myself))
END

Bei diesem Script funktioniert alles, nur mit dem

Code:
IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
    	StateCheck(Myself,STATE_SLOWED)
	HasItem("potn14",Myself) // Schnelligkeitsöl
THEN
    	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn14",Myself) // Schnelligkeitsöl
END

gibt es Probleme.

Wenn eine Kreatur verlangsamen auf einen Charakter wirkt, und dieses verlangsamen wird durch das Schnelligkeitsöl nicht aufgehoben (ist wohl immer so beim Schnelligkeitsöl ?), dann schluckt der Charakter aufgrund des Scripts jede Runde ein weiteres Schnelligkeitsöl, was er aber nicht tu soll.

Getestet habe ich das mit der Kreatur GORWOM06 aber das passiert auch bei bestimmten Schleimen :D als Gegner und anderen.

Wie kann ich es schaffen, dass genau 1 mal das Schnelligkeitsöl getrunken wird, und solange Hast auf dem Charakter aktiv ist, keine weiteren Schnelligkeitsöle getrunken werden, solange bis die Hast erloschen ist, dann soll wieder ein Schnelligkeitsöl getrunken werden, falls dann immer noch verlangsamen auf dem Charakter liegt.

-------------------------------------------------------------------------------------

Um das Problem noch mal anhand eines anderen Scripts zu verdeutlichen -->

Code:
IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,50)
	HasItem("potn10",Myself) // Unsichtbarkeitstrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn10",Myself) // Unsichtbarkeitstrank
END

Ist dieses Script aktiv, dann schluckt ein Charakter einen Unsichtbarkeitstrank, sobald die Gesundheit des Charakters niedriger als 50 % ist. Wenn der Charakter 24 Unsichtbarkeitstränke im Inventar hätte, dann würde er 24 Runden lang jeweils erneut einen Unsichtbarkeitstrank trinken, solange, bis die Gesundheit wieder 50 % oder mehr betragen würde.

Er soll aber nur einen einzigen Unsichtbarkeitstrank trinken, d.h. diese Scriptanweisung soll nur ein einziges Mal ausgeführt werden (ohne Heilung !)

Ich hoffe ich konnte mitteilen, was mein Problem ist.

Wie schaffe ich es, Scriptanweisungen nur einmal ausführen zu lassen ?

Ich weiß auch nicht wie man das Gegenteil von einem Status abfragen kann.

Man kann zum Beispiel abfragen ob ein Charakter vergiftet ist -->

StateCheck(Myself,STATE_POISONED)

Aber wie frage ich jetzt das Gegenteil ab, also wie frage ich ab, ob ein Charakter NICHT vergiftet ist ?, das würde vielleicht meine Probleme lösen.

Anmerkung :

Diese Scripts funktionieren natürlich nur solange, solange die entsprechenden Tränke im Inventar vorhanden sind.
 
Zuletzt bearbeitet von einem Moderator:

Dark Enchanter

Senior Member
Registriert
11.05.2013
Beiträge
126
Ich habe jetzt selber die Antwort gefunden :)

Mit dem ! (Ausrufezeichen) vor einer Abfrage fragt man das Gegenteil ab, dass ist praktisch so wie bei vielen Programmiersprachen der NOT() - Befehl.

Damit ist auch mein Problem gelöst -->

Script Nummer 01

Code:
IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
    	StateCheck(Myself,STATE_SLOWED)
	!StateCheck(Myself,STATE_HASTED)	
	HasItem("potn14",Myself) // Schnelligkeitsöl
THEN
    	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn14",Myself) // Schnelligkeitsöl
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
    	StateCheck(Myself,STATE_POISONED)
	HasItem("potn17",Myself) // Heilungselixier
THEN
    	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn17",Myself) // Heilungselixier
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
    	StateCheck(Myself,STATE_POISONED)
	HasItem("potn20",Myself) // Gegengift
THEN
    	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn20",Myself) // Gegengift
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,50)
	HasItem("potn55",Myself) // Extrastarker Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn55",Myself) // Extrastarker Heiltrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,65)
	HasItem("potn52",Myself) // Konzentrierter Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn52",Myself) // Konzentrierter Heiltrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,80)
	HasItem("potn08",Myself) // Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn08",Myself) // Heiltrank
END

IF
	InWeaponRange(NearestEnemyOf(Myself))
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(NearestEnemyOf(Myself))
END

IF
	AttackedBy([ANYONE],DEFAULT)
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(LastAttackerOf(Myself))
END

Die Anweisung !StateCheck(Myself,STATE_HASTED) bewirkt, dass kein Schnelligkeitsöl getrunken wird, wenn der Zustand "Hast" bereits auf dem Charakter liegt.

Script Nummer 02

Code:
IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,50)
	!StateCheck(Myself,STATE_INVISIBLE)
	HasItem("potn10",Myself) // Unsichtbarkeitstrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn10",Myself) // Unsichtbarkeitstrank
END

Dieses Script bewirkt, dass ein Charakter einen Unsichtbarkeitstrank trinkt, wenn seine Gesundheit unter 50 % liegt, und er wird keinen weiteren Unsichtbarkeitstrank trinken, solange er unsichtbar ist.
 

Dark Enchanter

Senior Member
Registriert
11.05.2013
Beiträge
126
Ich konnte jetzt ein ziemlich gutes Script basteln -->

Code:
IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,30)
	!StateCheck(Myself,STATE_INVISIBLE)
	HasItem("potn10",Myself) // Unsichtbarkeitstrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn10",Myself) // Unsichtbarkeitstrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	StateCheck(Myself,STATE_SLOWED)
	!StateCheck(Myself,STATE_HASTED)
	HasItem("potn14",Myself) // Schnelligkeitsöl
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn14",Myself) // Schnelligkeitsöl
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	StateCheck(Myself,STATE_POISONED)
	HasItem("potn17",Myself) // Heilungselixier
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn17",Myself) // Heilungselixier
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	StateCheck(Myself,STATE_POISONED)
	HasItem("potn20",Myself) // Gegengift
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn20",Myself) // Gegengift
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,50)
	HasItem("potn55",Myself) // Extrastarker Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn55",Myself) // Extrastarker Heiltrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,65)
	HasItem("potn52",Myself) // Konzentrierter Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn52",Myself) // Konzentrierter Heiltrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,80)
	HasItem("potn08",Myself) // Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",6)
		UseItem("potn08",Myself) // Heiltrank
END

IF
	InWeaponRange(NearestEnemyOf(Myself))
	!HPPercentLT(Myself,80)
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(NearestEnemyOf(Myself))
END

IF
	AttackedBy([ANYONE],DEFAULT)
	!HPPercentLT(Myself,30)
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(LastAttackerOf(Myself))
END

Solange man genug von den jeweiligen Tränken im Inventar, des Charakters der dieses Script benutzt, besitzt, solange funktioniert dieses Script ziemlich gut :D

An den Prozentzahlen kann vielleicht noch eine Feineinstellung vorgenommen werden :)
 
Zuletzt bearbeitet:

Dark Enchanter

Senior Member
Registriert
11.05.2013
Beiträge
126
Hier nochmal dasselbe Script, nur aggressiver, sodass ein Charakter der dieser Script benutzt Feinde sofort angreift, sobald er diese auch nur sieht, sofern er gesund genug ist :)

Code:
IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,30)
	!StateCheck(Myself,STATE_INVISIBLE)
	HasItem("potn10",Myself) // Unsichtbarkeitstrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",ONE_ROUND)
		UseItem("potn10",Myself) // Unsichtbarkeitstrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	StateCheck(Myself,STATE_SLOWED)
	!StateCheck(Myself,STATE_HASTED)
	HasItem("potn14",Myself) // Schnelligkeitsöl
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",ONE_ROUND)
		UseItem("potn14",Myself) // Schnelligkeitsöl
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	StateCheck(Myself,STATE_POISONED)
	HasItem("potn17",Myself) // Heilungselixier
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",ONE_ROUND)
		UseItem("potn17",Myself) // Heilungselixier
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	StateCheck(Myself,STATE_POISONED)
	HasItem("potn20",Myself) // Gegengift
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",ONE_ROUND)
		UseItem("potn20",Myself) // Gegengift
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,50)
	HasItem("potn55",Myself) // Extrastarker Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",ONE_ROUND)
		UseItem("potn55",Myself) // Extrastarker Heiltrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,65)
	HasItem("potn52",Myself) // Konzentrierter Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",ONE_ROUND)
		UseItem("potn52",Myself) // Konzentrierter Heiltrank
END

IF
	!GlobalTimerNotExpired("castnattack","LOCALS")
	HPPercentLT(Myself,80)
	HasItem("potn08",Myself) // Heiltrank
THEN
	RESPONSE #100
		SetGlobalTimer("castnattack","LOCALS",ONE_ROUND)
		UseItem("potn08",Myself) // Heiltrank
END

IF
	InWeaponRange(NearestEnemyOf(Myself))
	!HPPercentLT(Myself,80)
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(NearestEnemyOf(Myself))
END

IF
	AttackedBy([ANYONE],DEFAULT)
	!HPPercentLT(Myself,30)
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(LastAttackerOf(Myself))
END

IF
	See(NearestEnemyOf(Myself))
	!HPPercentLT(Myself,80)
	ActionListEmpty()
THEN
	RESPONSE #100
		AttackOneRound(NearestEnemyOf(Myself))
END
 
Oben