Portal-Zone Gothic-Zone Gothic II-Zone Gothic 3-Zone Gothic 4-Zone Modifikationen-Zone Download-Zone Foren-Zone RPG-Zone Almanach-Zone Spirit of Gothic

 

Seite 1 von 2 12 Letzte »
Ergebnis 1 bis 20 von 24
  1. Homepage besuchen Beiträge anzeigen #1 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline

    Neues Taschendiebstahl-System funktioniert nicht so, wie es soll...

    Hallo,
    ich arbeite heute schon so ziemlich den ganzen Tag an einem komplett neuen Taschendiebstahl-System für Gothic 2. Das Skript ist soweit fertig, allerdings gibt es leider noch ein Problem damit, das ich aus irgendeinem Grund nicht selbst gelöst bekomme...
    Der Dialog wird per ZS_Talk fast jedem NPC hinzugefügt, sollte der Spieler das Talent Taschendiebstahl beherrschen. Im Skript habe ich mehrere unterschiedliche Items festgelegt, die durch Hlp_Random an die bestehlbaren NPCs verteilt werden sollen. Und hier liegt auch schon das Problem... Sobald ich einen NPC anspreche, funktioniert alles erstmal so, wie es eigentlich auch soll. Spreche ich nun aber einen anderen NPC an, dem ebenfalls dieser Dialog per ZS_Talk hinzugefügt wird, erhält der vorherige NPC das gleiche Item, das dem danach angesprochenen NPC per Hlp_Random zugewiesen wurde. Somit haben beide NPCs dann plötzlich den gleichen Gegenstand, bis ich den nächsten NPC anspreche. Sobald das getan wurde, haben die beiden vorher angesprochenen NPCs den Gegenstand, den der NPC durch Hlp_Random bekommen hat, der nun angesprochen wurde.
    Versucht habe ich nun schon alles, was mir als mögliche Lösung eingefallen ist... In der Dialog-Funktion, habe ich einen neuen Aivar hinzugefügt, der auf TRUE gesetzt wird, sobald man einen beklaubaren NPC das erste mal angesprochen hat, dachte eigentlich, damit wäre das Problem gelöst, da die Funktion theoretisch so für diesen NPC nicht nochmal aufgerufen werden sollte. Das wird sie auch nicht mehr, allerdings nimmt der Dialog des NPCs trotzdem weiterhin den Gegenstand und die Dialogbeschreibung des nächsten NPCs an. Dann habe ich versucht, diesem Aivar einfach den Wert des durch Hlp_Random zugewiesenen Gegenstandes zuzuweisen, was laut Print zwar funktioniert, aber trotzdem das Problem nicht behebt.

    Code:
    // *************************// DIV_AmbientNPC_PickPocket
    // *************************
    
    
    var int TheftItem_PrintName;
    
    
    var int DIV_RandomTheftItem;
    var int DIV_RandomTheftItem_Amount;
    
    
    func int DIV_Cond_Pickpocket ()
    {
    	if (Npc_GetTalentSkill (other, NPC_TALENT_PICKPOCKET) == TRUE) 
    	&& (self.aivar[AIV_PlayerHasPickedMyPocket] 		  == FALSE)
    	{
    		if (Npc_IsInState (self, ZS_Talk))
    		{
    			return TRUE;
    		};
    	};
    };
    
    
    // *************************************************************************
    // 									EXIT
    // *************************************************************************
    instance DIA_AmbientNPC_PickPocket_Exit(C_INFO)
    {
    	nr			= 999;
    	condition	= DIA_AmbientNPC_PickPocket_Exit_Condition;
    	information	= DIA_AmbientNPC_PickPocket_Exit_Info;
    	permanent	= TRUE;
    	description = DIALOG_ENDE;
    };                       
    
    
    FUNC INT DIA_AmbientNPC_PickPocket_Exit_Condition()
    {
    	if (Npc_GetTalentSkill (hero, NPC_TALENT_PICKPOCKET) == TRUE)
    	&& (self.aivar[AIV_PlayerHasPickedMyPocket] == FALSE)
    	
    	&& (self.aivar[AIV_PARTYMEMBER] == FALSE)
    	&& (self.npctype 				!= NPCTYPE_MAIN)
    	&& (self.npctype 				!= NPCTYPE_FRIEND)
    	
    	&& (self.aivar[AIV_AMBIENTNPCHASENDDIALOG] == FALSE)
    	{
    		return TRUE;
    	};
    };
    
    
    FUNC VOID DIA_AmbientNPC_PickPocket_Exit_Info()
    {	
    	AI_StopProcessInfos	(self);
    };
    
    
    // ------------------------------------------------------
    instance DIA_AmbientNPC_PickPocket(C_INFO)
    {
    
    
    	nr			= 900;
    	condition	= DIA_AmbientNPC_PickPocket_Condition;
    	information	= DIA_AmbientNPC_PickPocket_Info;
    	permanent	= TRUE;
    };
    FUNC INT DIA_AmbientNPC_PickPocket_Condition()
    {
    	if (self.aivar[AIV_PARTYMEMBER] == FALSE)
    	&& (self.npctype 				!= NPCTYPE_FRIEND)
    	{
    		DIV_Cond_Pickpocket();
    	};
    };
    func VOID DIA_AmbientNPC_PickPocket_Info()
    {	
    	Info_ClearChoices	(DIA_AmbientNPC_PickPocket													 );
    	Info_AddChoice		(DIA_AmbientNPC_PickPocket, DIALOG_BACK 	 , DIA_AmbientNPC_PickPocket_BACK);
    	Info_AddChoice		(DIA_AmbientNPC_PickPocket, DIALOG_PICKPOCKET, DIA_AmbientNPC_PickPocket_DoIt);
    };
    func void DIA_AmbientNPC_PickPocket_DoIt()
    {
    	if (Hlp_Random (100) < other.attribute[ATR_DEXTERITY]+5)
    	{
    		CreateInvItems 			   (self, 		 DIV_RandomTheftItem, DIV_RandomTheftItem);
    		B_GiveInvItems_NoAnimation (self, other, DIV_RandomTheftItem, DIV_RandomTheftItem);
    		
    		if (DIV_RandomTheftItem == ItMi_Gold)
    		{
    			Npc_RemoveInvItems (self, ItMi_Gold, DIV_RandomTheftItem_Amount);
    		};
    		
    		self.aivar[AIV_PlayerHasPickedMyPocket] = TRUE;
    		
    		B_GivePlayerXP (5 * DIV_RandomTheftItem_Amount);
    		
    		Snd_Play ("Geldbeutel");
    		
    		DIV_MerkeErfolgreichenTaschendiebstahl = DIV_MerkeErfolgreichenTaschendiebstahl +1;
    		
    	} else {
    		
    		AI_StopProcessInfos	(self);
    		
    		B_Attack (self, other, AR_Theft, 1); //reagiert trotz IGNORE_Theft mit NEWS
    	};
    		
    	if (DIV_MerkeErfolgreichenTaschendiebstahl >= 10)
    	{
    		Npc_ChangeAttribute (other, ATR_DEXTERITY, 1);
    			
    		Print ("Geschicklichkeit +1");
    			
    		DIV_MerkeErfolgreichenTaschendiebstahl = 0;
    	};
    	
    	Info_ClearChoices (DIA_AmbientNPC_PickPocket);
    	
    	AI_StopProcessInfos	(self);
    };
    
    
    func void DIA_AmbientNPC_PickPocket_BACK()
    {
    	Info_ClearChoices (DIA_AmbientNPC_PickPocket);
    };
    
    
    // ****************************************************************
    // ----------------------------------------------------------------
    
    
    func void DIV_AmbientNPC_PickPocket(var C_NPC slf)
    {
    	DIA_AmbientNPC_PickPocket_Exit.npc = Hlp_GetInstanceID(slf);
    	DIA_AmbientNPC_PickPocket.npc 	   = Hlp_GetInstanceID(slf);
    	
    	if (!self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA])
    	{	
    		if 		  (Hlp_Random (200) <= 10) 		  					  { DIV_RandomTheftItem = ItPo_DIV_Gegengift;
    		
    		} else if (Hlp_Random (200) > 10) && (Hlp_Random (200) <= 20) { DIV_RandomTheftItem = ItPo_Mana_01;
    		} else if (Hlp_Random (200) > 20) && (Hlp_Random (200) <= 30) { DIV_RandomTheftItem = ItPo_Mana_02;
    		
    		} else if (Hlp_Random (200) > 30) && (Hlp_Random (200) <= 40) { DIV_RandomTheftItem = ItPo_Health_01;
    		} else if (Hlp_Random (200) > 40) && (Hlp_Random (200) <= 50) { DIV_RandomTheftItem = ItPo_Health_02;
    		} else if (Hlp_Random (200) > 50) && (Hlp_Random (200) <= 60) { DIV_RandomTheftItem = ItPo_Health_03;
    		
    		} else if (Hlp_Random (200) > 60) && (Hlp_Random (200) <= 70) { DIV_RandomTheftItem = ItMi_Gold;
    		
    		} else if (Hlp_Random (200) > 70) && (Hlp_Random (200) <= 80) { DIV_RandomTheftItem = ItMi_DIV_Krug;
    		} else if (Hlp_Random (200) > 80) && (Hlp_Random (200) <= 90) { DIV_RandomTheftItem = ItMi_Aquamarine;
    		} else if (Hlp_Random (200) > 90) && (Hlp_Random (200) <= 100) { DIV_RandomTheftItem = ItMi_Brush;
    		} else if (Hlp_Random (200) > 100) && (Hlp_Random (200) <= 110) { DIV_RandomTheftItem = ItMi_Joint;
    		} else if (Hlp_Random (200) > 110) && (Hlp_Random (200) <= 120) { DIV_RandomTheftItem = ItMi_SilverRing;
    		} else if (Hlp_Random (200) > 120) && (Hlp_Random (200) <= 130) { DIV_RandomTheftItem = ItMi_SilverNecklace;
    		} else if (Hlp_Random (200) > 130) && (Hlp_Random (200) <= 140) { DIV_RandomTheftItem = ItMi_DIV_GoldRing;
    		} else if (Hlp_Random (200) > 140) && (Hlp_Random (200) <= 150) { DIV_RandomTheftItem = ItMi_DIV_GoldNecklace;
    		} else if (Hlp_Random (200) > 150) && (Hlp_Random (200) <= 160) { DIV_RandomTheftItem = ItMi_Pitch;
    		} else if (Hlp_Random (200) > 160) && (Hlp_Random (200) <= 170) { DIV_RandomTheftItem = ItMi_JeweleryChest;
    		
    		} else if (Hlp_Random (200) > 170) && (Hlp_Random (200) <= 180) { DIV_RandomTheftItem = ItFo_Bread;
    		} else if (Hlp_Random (200) > 180) && (Hlp_Random (200) <= 190) { DIV_RandomTheftItem = ItFo_Wine;
    		} else if (Hlp_Random (200) > 190) && (Hlp_Random (200) <= 200) { DIV_RandomTheftItem = ItFo_DIV_Bottle_Beer; };
    		
    		Print (IntToString(self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA]));
    
    
    		TheftItem_PrintName = Itm_GetPtr(DIV_RandomTheftItem);
    
    
    		var oCItem TheftItemName;
    		TheftItemName = MEM_PtrToInst(TheftItem_PrintName);
    		
    		
    		if (DIV_RandomTheftItem == ItMi_Gold) 
    		{ 
    			DIV_RandomTheftItem_Amount = Hlp_Random (30);
    		
    		} else {
    		
    			DIV_RandomTheftItem_Amount = Hlp_Random (3);
    		};
    		
    		if (DIV_RandomTheftItem_Amount < 1)
    		{
    			DIV_RandomTheftItem_Amount = 1;
    		};
    
    
    
    
    		var string TheftString1; TheftString1 = ConcatStrings ("(Versuchen, dieser Person ", IntToString(DIV_RandomTheftItem_Amount));
    		var string TheftString2; TheftString2 = ConcatStrings ("x ", TheftItemName.description);
    		
    		var string TheftString_All_PI;  TheftString_All_PI  = ConcatStrings (TheftString1, TheftString2);
    		var string TheftString_All_PII; TheftString_All_PII = ConcatStrings (" zu stehlen.)", " ");
    		
    		var string TheftString_All; TheftString_All = ConcatStrings (TheftString_All_PI, TheftString_All_PII);
    		
    		DIA_AmbientNPC_PickPocket.description = TheftString_All;
    	};
    };
    Den Dialog selbst, füge ich per ZS_Talk hinzu:

    Code:
    		if (self.aivar[AIV_PARTYMEMBER] == FALSE)
    		// && (self.npctype 				!= NPCTYPE_MAIN)
    		&& (self.npctype 				!= NPCTYPE_FRIEND)
    		
    		&& (Npc_GetTalentSkill (hero, NPC_TALENT_PICKPOCKET) == TRUE)
    		
    		&& (self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] == 0)
    		{
    			DIV_AmbientNPC_PickPocket(self);
    		};
    Jemand eine Idee? Auch finde ich generell die Verteilung der Items per Hlp_Random noch etwas bescheiden... Besser wäre es mMn., wenn dort direkt ein zufälliger Gegenstand aus dem Inventar des NPCs ausgewählt wird. Leider habe ich auch dafür selbst keine Möglichkeit gefunden... Eventuell weiß auch hier jemand, wie man das umsetzen könnte?

  2. Beiträge anzeigen #2 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Das kann so nicht funktionieren. Du überschreibst jedes Mal die Variable DIV_RandomTheftItem und die kann natürlich nicht mehrere Werte gleichzeitig besitzen. Stattdessen musst du den Wert an den jeweiligen NPC binden, z.B. indem du eine AIVar benutzt (oder das Talents Paket von LeGo).

  3. Beiträge anzeigen #3 Zitieren
    now also in your universe  Avatar von Milky-Way
    Registriert seit
    Jun 2007
    Beiträge
    15.204
     
    Milky-Way ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Das kann so nicht funktionieren. Du überschreibst jedes Mal die Variable DIV_RandomTheftItem und die kann natürlich nicht mehrere Werte gleichzeitig besitzen. Stattdessen musst du den Wert an den jeweiligen NPC binden, z.B. indem du eine AIVar benutzt (oder das Talents Paket von LeGo).
    Dabei bitte bedenken, dass sich bei zukünftigen Änderungen an den Skripten / Patches, die Instanzen verschieben, so dass ein zuvor gemerkter Integer für den Npc dann nach Patch nicht mehr aufs selbe Item verweist (und potenziell zu Abstürzen führt). Ich spreche aus Erfahrung mit ähnlichen Anwendungen (Monster-Respawn).

  4. Homepage besuchen Beiträge anzeigen #4 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Zitat Zitat von Lehona Beitrag anzeigen
    Das kann so nicht funktionieren. Du überschreibst jedes Mal die Variable DIV_RandomTheftItem und die kann natürlich nicht mehrere Werte gleichzeitig besitzen. Stattdessen musst du den Wert an den jeweiligen NPC binden, z.B. indem du eine AIVar benutzt (oder das Talents Paket von LeGo).
    So hatte ich es ebenfalls schon probiert:

    Code:
    // *************************// DIV_AmbientNPC_PickPocket
    // *************************
    
    
    var int TheftItem_PrintName;
    
    
    var int DIV_RandomTheftItem;
    var int DIV_RandomTheftItem_Amount;
    
    
    func int DIV_Cond_Pickpocket ()
    {
    	if (Npc_GetTalentSkill (other, NPC_TALENT_PICKPOCKET) == TRUE) 
    	&& (self.aivar[AIV_PlayerHasPickedMyPocket] 		  == FALSE)
    	{
    		if (Npc_IsInState (self, ZS_Talk))
    		{
    			return TRUE;
    		};
    	};
    };
    
    
    // *************************************************************************
    // 									EXIT
    // *************************************************************************
    instance DIA_AmbientNPC_PickPocket_Exit(C_INFO)
    {
    	nr			= 999;
    	condition	= DIA_AmbientNPC_PickPocket_Exit_Condition;
    	information	= DIA_AmbientNPC_PickPocket_Exit_Info;
    	permanent	= TRUE;
    	description = DIALOG_ENDE;
    };                       
    
    
    FUNC INT DIA_AmbientNPC_PickPocket_Exit_Condition()
    {
    	if (Npc_GetTalentSkill (hero, NPC_TALENT_PICKPOCKET) == TRUE)
    	&& (self.aivar[AIV_PlayerHasPickedMyPocket] == FALSE)
    	
    	&& (self.aivar[AIV_PARTYMEMBER] == FALSE)
    	&& (self.npctype 				!= NPCTYPE_MAIN)
    	&& (self.npctype 				!= NPCTYPE_FRIEND)
    	
    	&& (self.aivar[AIV_AMBIENTNPCHASENDDIALOG] == FALSE)
    	{
    		return TRUE;
    	};
    };
    
    
    FUNC VOID DIA_AmbientNPC_PickPocket_Exit_Info()
    {	
    	AI_StopProcessInfos	(self);
    };
    
    
    // ------------------------------------------------------
    instance DIA_AmbientNPC_PickPocket(C_INFO)
    {
    
    
    	nr			= 900;
    	condition	= DIA_AmbientNPC_PickPocket_Condition;
    	information	= DIA_AmbientNPC_PickPocket_Info;
    	permanent	= TRUE;
    };
    FUNC INT DIA_AmbientNPC_PickPocket_Condition()
    {
    	if (self.aivar[AIV_PARTYMEMBER] == FALSE)
    	&& (self.npctype 				!= NPCTYPE_FRIEND)
    	{
    		DIV_Cond_Pickpocket();
    	};
    };
    func VOID DIA_AmbientNPC_PickPocket_Info()
    {	
    	Info_ClearChoices	(DIA_AmbientNPC_PickPocket													 );
    	Info_AddChoice		(DIA_AmbientNPC_PickPocket, DIALOG_BACK 	 , DIA_AmbientNPC_PickPocket_BACK);
    	Info_AddChoice		(DIA_AmbientNPC_PickPocket, DIALOG_PICKPOCKET, DIA_AmbientNPC_PickPocket_DoIt);
    };
    func void DIA_AmbientNPC_PickPocket_DoIt()
    {
    	if (Hlp_Random (100) < other.attribute[ATR_DEXTERITY]+5)
    	{
    		CreateInvItems 			   (self, 		 self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA], DIV_RandomTheftItem_Amount);
    		B_GiveInvItems_NoAnimation (self, other, self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA], DIV_RandomTheftItem_Amount);
    		
    		if (self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] == ItMi_Gold)
    		{
    			Npc_RemoveInvItems (self, ItMi_Gold, DIV_RandomTheftItem_Amount);
    		};
    		
    		self.aivar[AIV_PlayerHasPickedMyPocket] = TRUE;
    		
    		B_GivePlayerXP (5 * DIV_RandomTheftItem_Amount);
    		
    		Snd_Play ("Geldbeutel");
    		
    		DIV_MerkeErfolgreichenTaschendiebstahl = DIV_MerkeErfolgreichenTaschendiebstahl +1;
    		
    	} else {
    		
    		AI_StopProcessInfos	(self);
    		
    		B_Attack (self, other, AR_Theft, 1); //reagiert trotz IGNORE_Theft mit NEWS
    	};
    		
    	if (DIV_MerkeErfolgreichenTaschendiebstahl >= 10)
    	{
    		Npc_ChangeAttribute (other, ATR_DEXTERITY, 1);
    			
    		Print ("Geschicklichkeit +1");
    			
    		DIV_MerkeErfolgreichenTaschendiebstahl = 0;
    	};
    	
    	Info_ClearChoices (DIA_AmbientNPC_PickPocket);
    	
    	AI_StopProcessInfos	(self);
    };
    
    
    func void DIA_AmbientNPC_PickPocket_BACK()
    {
    	Info_ClearChoices (DIA_AmbientNPC_PickPocket);
    };
    
    
    // ****************************************************************
    // ----------------------------------------------------------------
    
    
    func void DIV_AmbientNPC_PickPocket(var C_NPC slf)
    {
    	DIA_AmbientNPC_PickPocket_Exit.npc = Hlp_GetInstanceID(slf);
    	DIA_AmbientNPC_PickPocket.npc 	   = Hlp_GetInstanceID(slf);
    	
    	if (!self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA])
    	{	
    		if 		  (Hlp_Random (200) <= 10) 		  					  { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItPo_DIV_Gegengift;
    		
    		} else if (Hlp_Random (200) > 10) && (Hlp_Random (200) <= 20) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItPo_Mana_01;
    		} else if (Hlp_Random (200) > 20) && (Hlp_Random (200) <= 30) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItPo_Mana_02;
    		
    		} else if (Hlp_Random (200) > 30) && (Hlp_Random (200) <= 40) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItPo_Health_01;
    		} else if (Hlp_Random (200) > 40) && (Hlp_Random (200) <= 50) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItPo_Health_02;
    		} else if (Hlp_Random (200) > 50) && (Hlp_Random (200) <= 60) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItPo_Health_03;
    		
    		} else if (Hlp_Random (200) > 60) && (Hlp_Random (200) <= 70) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_Gold;
    		
    		} else if (Hlp_Random (200) > 70) && (Hlp_Random (200) <= 80) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_DIV_Krug;
    		} else if (Hlp_Random (200) > 80) && (Hlp_Random (200) <= 90) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_Aquamarine;
    		} else if (Hlp_Random (200) > 90) && (Hlp_Random (200) <= 100) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_Brush;
    		} else if (Hlp_Random (200) > 100) && (Hlp_Random (200) <= 110) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_Joint;
    		} else if (Hlp_Random (200) > 110) && (Hlp_Random (200) <= 120) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_SilverRing;
    		} else if (Hlp_Random (200) > 120) && (Hlp_Random (200) <= 130) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_SilverNecklace;
    		} else if (Hlp_Random (200) > 130) && (Hlp_Random (200) <= 140) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_DIV_GoldRing;
    		} else if (Hlp_Random (200) > 140) && (Hlp_Random (200) <= 150) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_DIV_GoldNecklace;
    		} else if (Hlp_Random (200) > 150) && (Hlp_Random (200) <= 160) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_Pitch;
    		} else if (Hlp_Random (200) > 160) && (Hlp_Random (200) <= 170) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItMi_JeweleryChest;
    		
    		} else if (Hlp_Random (200) > 170) && (Hlp_Random (200) <= 180) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItFo_Bread;
    		} else if (Hlp_Random (200) > 180) && (Hlp_Random (200) <= 190) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItFo_Wine;
    		} else if (Hlp_Random (200) > 190) && (Hlp_Random (200) <= 200) { self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] = ItFo_DIV_Bottle_Beer; };
    		
    		Print (IntToString(self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA]));
    
    
    		TheftItem_PrintName = Itm_GetPtr(self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA]);
    
    
    		var oCItem TheftItemName;
    		TheftItemName = MEM_PtrToInst(TheftItem_PrintName);
    		
    		
    		if (self.aivar[AIV_AMBIENTNPCHASPICKPOCKETDIA] == ItMi_Gold) 
    		{ 
    			DIV_RandomTheftItem_Amount = Hlp_Random (30);
    		
    		} else {
    		
    			DIV_RandomTheftItem_Amount = Hlp_Random (3);
    		};
    		
    		if (DIV_RandomTheftItem_Amount < 1)
    		{
    			DIV_RandomTheftItem_Amount = 1;
    		};
    
    
    
    
    		var string TheftString1; TheftString1 = ConcatStrings ("(Versuchen, dieser Person ", IntToString(DIV_RandomTheftItem_Amount));
    		var string TheftString2; TheftString2 = ConcatStrings ("x ", TheftItemName.description);
    		
    		var string TheftString_All_PI;  TheftString_All_PI  = ConcatStrings (TheftString1, TheftString2);
    		var string TheftString_All_PII; TheftString_All_PII = ConcatStrings (" zu stehlen.)", " ");
    		
    		var string TheftString_All; TheftString_All = ConcatStrings (TheftString_All_PI, TheftString_All_PII);
    		
    		DIA_AmbientNPC_PickPocket.description = TheftString_All;
    	};
    };

    Das wäre doch richtig, oder?

  5. Beiträge anzeigen #5 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Das sieht schon besser aus, ja. Du setzt aber auch die .description des Dialogs nur einmal, nämlich wenn man den NPC das erste Mal anspricht. Wenn jeder NPC seine eigene Dialogbeschreibung haben soll, musst du diesen Teil jedes Mal machen.

  6. Homepage besuchen Beiträge anzeigen #6 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Danke, das scheint zu funktionieren. So sieht die Funktion nun aus:

    Code:
    func void DIV_AmbientNPC_PickPocket(var C_NPC slf){
    	DIA_AmbientNPC_PickPocket_Exit.npc = Hlp_GetInstanceID(slf);
    	DIA_AmbientNPC_PickPocket.npc 	   = Hlp_GetInstanceID(slf);
    	
    	if (!self.aivar[AIV_PPNPCREMEMBERITEM])
    	{	
    		if 		  (Hlp_Random (200) <= 10) 		  					    { self.aivar[AIV_PPNPCREMEMBERITEM] = ItPo_DIV_Gegengift;
    		
    		} else if (Hlp_Random (200) > 10) && (Hlp_Random (200) <= 20)   { self.aivar[AIV_PPNPCREMEMBERITEM] = ItPo_Mana_01;
    		} else if (Hlp_Random (200) > 20) && (Hlp_Random (200) <= 30)   { self.aivar[AIV_PPNPCREMEMBERITEM] = ItPo_Mana_02;
    		
    		} else if (Hlp_Random (200) > 30) && (Hlp_Random (200) <= 40)   { self.aivar[AIV_PPNPCREMEMBERITEM] = ItPo_Health_01;
    		} else if (Hlp_Random (200) > 40) && (Hlp_Random (200) <= 50)   { self.aivar[AIV_PPNPCREMEMBERITEM] = ItPo_Health_02;
    		} else if (Hlp_Random (200) > 50) && (Hlp_Random (200) <= 60)   { self.aivar[AIV_PPNPCREMEMBERITEM] = ItPo_Health_03;
    		
    		} else if (Hlp_Random (200) > 60) && (Hlp_Random (200) <= 70)   { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_Gold;
    		
    		} else if (Hlp_Random (200) > 70) && (Hlp_Random (200) <= 80)   { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_DIV_Krug;
    		} else if (Hlp_Random (200) > 80) && (Hlp_Random (200) <= 90)   { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_Aquamarine;
    		} else if (Hlp_Random (200) > 90) && (Hlp_Random (200) <= 100)  { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_Brush;
    		} else if (Hlp_Random (200) > 100) && (Hlp_Random (200) <= 110) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_Joint;
    		} else if (Hlp_Random (200) > 110) && (Hlp_Random (200) <= 120) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_SilverRing;
    		} else if (Hlp_Random (200) > 120) && (Hlp_Random (200) <= 130) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_SilverNecklace;
    		} else if (Hlp_Random (200) > 130) && (Hlp_Random (200) <= 140) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_DIV_GoldRing;
    		} else if (Hlp_Random (200) > 140) && (Hlp_Random (200) <= 150) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_DIV_GoldNecklace;
    		} else if (Hlp_Random (200) > 150) && (Hlp_Random (200) <= 160) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_Pitch;
    		} else if (Hlp_Random (200) > 160) && (Hlp_Random (200) <= 170) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItMi_JeweleryChest;
    		
    		} else if (Hlp_Random (200) > 170) && (Hlp_Random (200) <= 180) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItFo_Bread;
    		} else if (Hlp_Random (200) > 180) && (Hlp_Random (200) <= 190) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItFo_Wine;
    		} else if (Hlp_Random (200) > 190) && (Hlp_Random (200) <= 200) { self.aivar[AIV_PPNPCREMEMBERITEM] = ItFo_DIV_Bottle_Beer; };
    	
    		if (self.aivar[AIV_PPNPCREMEMBERITEM] == ItMi_Gold) 
    		{ 
    			self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = Hlp_Random (37);
    		
    		} else {
    		
    			self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = Hlp_Random (3);
    		};
    		
    		if (self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] < 1)
    		{
    			self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = 1;
    		};
    	};
    	
    	Print (IntToString(self.aivar[AIV_PPNPCREMEMBERITEM]));
    	
    	TheftItem_PrintName = Itm_GetPtr(self.aivar[AIV_PPNPCREMEMBERITEM]);
    
    
    	var oCItem TheftItemName;
    	TheftItemName = MEM_PtrToInst(TheftItem_PrintName);
    
    
    	var string TheftString1; TheftString1 = ConcatStrings ("(Versuchen, dieser Person ", IntToString(self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]));
    	var string TheftString2; TheftString2 = ConcatStrings ("x ", TheftItemName.description);
    	
    	var string TheftString_All_PI;  TheftString_All_PI  = ConcatStrings (TheftString1, TheftString2);
    	var string TheftString_All_PII; TheftString_All_PII = ConcatStrings (" zu stehlen.)", " "); 
    	
    	var string TheftString_All;		TheftString_All 	= ConcatStrings (TheftString_All_PI, TheftString_All_PII);
    	
    	DIA_AmbientNPC_PickPocket.description = TheftString_All;
    };
    Komisch, da ich eigentlich der Meinung bin, dass ich das gestern Abend schon mal so oder so ähnlich probiert hatte und es trotzdem NICHT funktionierte. Aber ich war gestern generell ziemlich durcheinander... ^^

    Zitat Zitat von Lehona Beitrag anzeigen
    Das sieht schon besser aus, ja. Du setzt aber auch die .description des Dialogs nur einmal, nämlich wenn man den NPC das erste Mal anspricht. Wenn jeder NPC seine eigene Dialogbeschreibung haben soll, musst du diesen Teil jedes Mal machen.

  7. Beiträge anzeigen #7 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Das abspeichern einer Item ID in einer Variable kann gefährlich sein, falls man das Spiel speichern kann und dann nach dem laden des Spielstandes der gespeicherte Wert weiterverwendet wird.
    Falls du einen patch raus bringst nachdem an den Skripten etwas verändert wurde, können sich die IDs alle verschieben.
    Der gespeicherte Wert könnte dann auf ein ganz anderes item zeigen, oder sogar auf etwas was gar kein item ist(eine Funktion zum Beispiel).

    Da kann dann sehr viel Unfug passieren, weil CreateInvItems nicht prüft ob es sich überhaupt um ein item handelt was da erstellt werden soll:
    Zitat Zitat von NicoDE Beitrag anzeigen
    pps: Noch "schöner" ist, dass man auch C_NPC-Instanzen ins Inventar legen kann:
    Code:
    CreateInvItems(hero, PC_Hero, 42);
    Anhang 45638
    Ich denke es wäre da sinnvoller irgendeine Art von Umweg zu gehen. Beispielweise den Instanznamen als string speichern und dann vor Erstellen des items ermitteln welche ID die Instanz mit diesem Namen hat.
    Geändert von Cryp18Struct (31.05.2019 um 23:51 Uhr)

  8. Homepage besuchen Beiträge anzeigen #8 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Danke für den Hinweis. Aber wie stelle ich das denn am einfachsten an? Einer Aivar kann man ja keinen String geben und ich wüsste auch nicht, wie ich sonst an jeden einzelnen NPC das jeweilige stehlbare Item binden kann. Auch habe ich keine Idee, wie ich dann abfragen könnte, welche ID die jeweilige Instanz hat, die als string gespeichert wurde?
    Geändert von Bloodfly91 (01.06.2019 um 12:40 Uhr)

  9. Beiträge anzeigen #9 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Gute Fragen.

    Wenn du Strings speichern möchtest - insbesondere wenn es sich um eine beliebige Anzahl an Strings (1x pro NPC) handelt - kommst du um LeGo nicht herum. Mit PermMem lassen sich beliebige Klassen in einem Int speichern, und um es dem Anwender ein bisschen einfacher zu machen sind schon einige Klassen vordefiniert, die z.B. nur genau einen String speichern (siehe PermMem_Structs.d). Dazu machst du folgendes:

    Code:
    var int handle; handle = new(string@); // Ein neues Objekt der Klasse _string anlegen
    var _string str; str = get(handle);
    str.s = "MyString";
    Jetzt kannst du den Wert von 'handle' einfach in einer AIVar speichern.

    Wenn du wieder auf den String zugreifen willst, funktioniert das so:

    Code:
    var _string str; str = get(handle); // 'handle' kommt dann z.B. aus der AIVar
    print(str.s);
    Von einem String auf die Instanz(ID) kommst du mit Ikarus:

    Code:
    var int id; id = MEM_FindParserSymbol("ItMi_Gold");
    CreateInvItems(hero, id, 3);
    Geändert von Lehona (01.06.2019 um 17:42 Uhr)

  10. Homepage besuchen Beiträge anzeigen #10 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Vielen Dank Lehona, aber ehrlich gesagt kann ich mit dem Großteil dieses Codes nicht wirklich viel anfangen, da ich scheinbar zu blöd bin, den bei mir richtig einzubauen... xD

    Code:
    func void DIV_AmbientNPC_PickPocket(var C_NPC slf)
    {
        DIA_AmbientNPC_PickPocket_Exit.npc = Hlp_GetInstanceID(slf);
        DIA_AmbientNPC_PickPocket.npc        = Hlp_GetInstanceID(slf);
        
        var int handle; handle = new(string@); // Ein neues Objekt der Klasse _string anlegen
        
        var _string str; str.s = "MyString";
    
    
        if (!slf.aivar[AIV_PPNPCREMEMBERITEM])
        {
            if           (Hlp_Random (210) <= 5)                                 { str.s = "ItPo_DIV_Gegengift"; slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else                                                             { str.s = "ItPo_Mana_01";         slf.aivar[AIV_PPNPCREMEMBERITEM] = handle; 
            
            };
        };
        
        Print (IntToString(slf.aivar[AIV_PPNPCREMEMBERITEM]));
        
        str = get(handle);
        var int id; id = MEM_FindParserSymbol(str.s);
    
    
        TheftItem_PrintName = Itm_GetPtr(id);
    
    
        var oCItem TheftItemName;
        TheftItemName = MEM_PtrToInst(TheftItem_PrintName);
    
    
        var string TheftString1; TheftString1 = ConcatStrings ("(Versuchen, dieser Person ", IntToString(slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]));
        var string TheftString2; TheftString2 = ConcatStrings ("x ", TheftItemName.description);
        
        var string TheftString_All_PI;  TheftString_All_PI  = ConcatStrings (TheftString1, TheftString2);
    
    
            // var string TheftString_All_PII; TheftString_All_PII = ConcatStrings (" zu stehlen.)", " "); 
        
        var string TheftString_All;        TheftString_All     = ConcatStrings (TheftString_All_PI, " zu stehlen.)");
        
        DIA_AmbientNPC_PickPocket.description = TheftString_All;
    };
    Der erste Teil, also den String zu speichern, funktioniert scheinbar sogar noch (wenn man dem Print glauben kann), was mich tatsächlich etwas wundert bzw. wundern würde. Allerdings schaffe ich es einfach nicht, auf den String zuzugreifen. Getestet habe ich es vorerst nur mit Itm_GetPtr, also dem rot markierten Code. zSpy meldet ebenfalls die Meldung "Adressing an empty instance: _STRING.S"... Füge ich das var _string str; weiter unten, über str = get(handle); nochmal hinzu, meldet mir das Spiel (natürlich), dass diese Variable bereits existiert.

    Könntest du mir das bitte nochmal etwas genauer erklären?

    Edit: Print(str.s); funktioniert übrigens auch nicht, es erscheint kein Print und zSpy meldet die gleiche Meldung.

    Zitat Zitat von Lehona Beitrag anzeigen
    Gute Fragen.

    Wenn du Strings speichern möchtest - insbesondere wenn es sich um eine beliebige Anzahl an Strings (1x pro NPC) handelt - kommst du um LeGo nicht herum. Mit PermMem lassen sich beliebige Klassen in einem Int speichern, und um es dem Anwender ein bisschen einfacher zu machen sind schon einige Klassen vordefiniert, die z.B. nur genau einen String speichern (siehe PermMem_Structs.d). Dazu machst du folgendes:

    Code:
    var int handle; handle = new(string@); // Ein neues Objekt der Klasse _string anlegen
    var _string str; str.s = "MyString";
    Jetzt kannst du den Wert von 'handle' einfach in einer AIVar speichern.

    Wenn du wieder auf den String zugreifen willst, funktioniert das so:

    Code:
    var _string str; str = get(handle); // 'handle' kommt dann z.B. aus der AIVar
    print(str.s);
    Von einem String auf die Instanz(ID) kommst du mit Ikarus:

    Code:
    var int id; id = MEM_FindParserSymbol("ItMi_Gold");
    CreateInvItems(hero, id, 3);
    Geändert von Bloodfly91 (01.06.2019 um 17:45 Uhr)

  11. Beiträge anzeigen #11 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Da habe ich tatsächlich in der Eile eine Zeile vergessen in meinem ersten Codeschnipsel
    Aber die Erklärung war auch ein wenig knapp.

    Mit

    Code:
    var int handle; handle = new(string@); // Ein neues Objekt der Klasse _string anlegen
    var _string str; str = get(handle);
    str.s = "MyString";
    (man beachte das extra 'get') sind der _string 'str' und der Integer 'handle' jetzt verknüpft. Vorher hast du tatsächlich in eine leere Instanz geschrieben.

    Dein Versuch an den Itemnamen zu kommen ist gar nicht mal so falsch. Itm_GetPtr() gibt einen Pointer auf ein Item der übergebenen Instanz zurück. Auf diesen Pointer kannst du dann mittels einer Variable vom Typ C_Item (oder oCItem) zugreifen:

    Code:
    var int itmPtr; itmPtr = Itm_GetPtr(id);
    var C_Item itm; itm = MEM_PtrToInst(itmPtr);
    print(itm.name);
    Edit: Ich sehe gerade den größten Teil dieser Erklärung hätte ich mir sparen können, mich haben nur deine Variablennamen verwirrt. Naja, mit dem zusätzlichen 'get' sollte dann schon alles klappen!

  12. Homepage besuchen Beiträge anzeigen #12 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Okay, danke. Das scheint soweit schon mal zu funktionieren. aber jetzt gibt es leider wieder ein neues Problem...

    Nun passiert es wieder, dass NPCs, die man das erste mal anspricht, zwar ihr Item haben, das per Hlp_Random ausgewählt wurde, sobald man den nächsten anspricht aber wieder das Item von dem nun angesprochenen NPC auch für den vorherigen übernommen wird. Könnte es sein, dass die vorherige Abfrage, die if (!slf.aivar[AIV_PPNPCREMEMBERITEM]) nun nicht mehr einfach so verwendet werden kann, da diese nun mit einem String befüllt wird? Oder wird str.s immer wieder mit dem neuen String befüllt und die Dialog-Beschreibung ändert sich deshalb immer wieder, was ich mir eigentlich nicht wirklich vorstellen kann?

    Edit: Auch passiert es nun wieder, dass alle NPCs, die angesprochen wurden, nach dem neustarten von G2 nur noch ein leeres Item haben und geben, wenn der Spielstand gespeichert und geladen wurde. Ein Bug, den ich auch letztens noch hatte, beheben konnte, aber jetzt durch die ganzen Änderungen wieder auftritt. Es wirkt so, als wäre danach die AIV_PPNPCREMEMBERITEM leer, obwohl in der SCRPTSAVE alles richtig gespeichert wird.

    Zitat Zitat von Lehona Beitrag anzeigen
    Da habe ich tatsächlich in der Eile eine Zeile vergessen in meinem ersten Codeschnipsel
    Aber die Erklärung war auch ein wenig knapp.

    Mit

    Code:
    var int handle; handle = new(string@); // Ein neues Objekt der Klasse _string anlegen
    var _string str; str = get(handle);
    str.s = "MyString";
    (man beachte das extra 'get') sind der _string 'str' und der Integer 'handle' jetzt verknüpft. Vorher hast du tatsächlich in eine leere Instanz geschrieben.

    Dein Versuch an den Itemnamen zu kommen ist gar nicht mal so falsch. Itm_GetPtr() gibt einen Pointer auf ein Item der übergebenen Instanz zurück. Auf diesen Pointer kannst du dann mittels einer Variable vom Typ C_Item (oder oCItem) zugreifen:

    Code:
    var int itmPtr; itmPtr = Itm_GetPtr(id);
    var C_Item itm; itm = MEM_PtrToInst(itmPtr);
    print(itm.name);
    Edit: Ich sehe gerade den größten Teil dieser Erklärung hätte ich mir sparen können, mich haben nur deine Variablennamen verwirrt. Naja, mit dem zusätzlichen 'get' sollte dann schon alles klappen!
    Geändert von Bloodfly91 (01.06.2019 um 21:16 Uhr) Grund: Eigene Lösung für zweites Problem gefunden.

  13. Beiträge anzeigen #13 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Du könntest möglicherweise mit Hlp_IsValidHandle(int) abfragen ob schon einmal das Diebstahl item festgelegt wurde.
    Aber ich glaube du speicherst das handle noch nicht richtig.
    [Falls du da wirklich eine Variable "handle" verwendest im Sinne von
    Code:
    var int handle; handle = new(string@);
    Das "handle", Sprich: Die Zahl die von der Funktion new() zurückgegeben wird, solltest du wahrscheinlich in slf.aivar[AIV_PPNPCREMEMBERITEM] abspeichern und dann später auch darauf zugreifen etwa so:
    Code:
    slf.aivar[AIV_PPNPCREMEMBERITEM] = new(string@);
    [...]
    [hier jetzt das neu erstellte objekt, beziehungsweise den darin enthaltenen string sinnvoll befüllen]
    [...]
    var _string str; str = get(slf.aivar[AIV_PPNPCREMEMBERITEM]);
    print(str.s);
    ]
    Zeig bitte noch mal deinen kompletten code wie er jetzt ist.

  14. Homepage besuchen Beiträge anzeigen #14 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Hier der komplette Code:

    Code:
    // *************************// DIV_AmbientNPC_PickPocket
    // *************************
    var int TheftItem_PrintName;
    
    
    var int handle; //handle = new(string@); // Ein neues Objekt der Klasse _string anlegen
        
    var _string str; //str = get(handle);
    
    
    var int id;
    
    
    
    
    func int DIV_Cond_Pickpocket ()
    {
        if (Npc_GetTalentSkill (other, NPC_TALENT_PICKPOCKET) == TRUE) 
        && (self.aivar[AIV_PlayerHasPickedMyPocket]           == FALSE)
        {
            if (Npc_IsInState (self, ZS_Talk))
            {
                return TRUE;
            };
        };
    };
    
    
    // *************************************************************************
    //                                     EXIT
    // *************************************************************************
    instance DIA_AmbientNPC_PickPocket_Exit(C_INFO)
    {
        nr            = 999;
        condition    = DIA_AmbientNPC_PickPocket_Exit_Condition;
        information    = DIA_AmbientNPC_PickPocket_Exit_Info;
        permanent    = TRUE;
        description = DIALOG_ENDE;
    };                       
    
    
    FUNC INT DIA_AmbientNPC_PickPocket_Exit_Condition()
    {
        if (Npc_GetTalentSkill (hero, NPC_TALENT_PICKPOCKET) == TRUE)
        && (self.aivar[AIV_PlayerHasPickedMyPocket] == FALSE)
        
        && (self.aivar[AIV_PARTYMEMBER] == FALSE)
        && (self.npctype                 != NPCTYPE_MAIN)
        && (self.npctype                 != NPCTYPE_FRIEND)
        
        && (self.aivar[AIV_AMBIENTNPCHASENDDIALOG] == FALSE)
        {
            return TRUE;
        };
    };
    
    
    FUNC VOID DIA_AmbientNPC_PickPocket_Exit_Info()
    {    
        AI_StopProcessInfos    (self);
    };
    
    
    // ------------------------------------------------------
    instance DIA_AmbientNPC_PickPocket(C_INFO)
    {
    
    
        nr            = 900;
        condition    = DIA_AmbientNPC_PickPocket_Condition;
        information    = DIA_AmbientNPC_PickPocket_Info;
        permanent    = TRUE;
    };
    FUNC INT DIA_AmbientNPC_PickPocket_Condition()
    {
        if (self.aivar[AIV_PARTYMEMBER] == FALSE)
        && (self.npctype                 != NPCTYPE_FRIEND)
        {
            DIV_Cond_Pickpocket();
        };
    };
    func VOID DIA_AmbientNPC_PickPocket_Info()
    {    
        Info_ClearChoices    (DIA_AmbientNPC_PickPocket                                                     );
        Info_AddChoice        (DIA_AmbientNPC_PickPocket, DIALOG_BACK      , DIA_AmbientNPC_PickPocket_BACK);
        Info_AddChoice        (DIA_AmbientNPC_PickPocket, DIALOG_PICKPOCKET, DIA_AmbientNPC_PickPocket_DoIt);
    };
    
    
    func void DIA_AmbientNPC_PickPocket_BACK()
    {
        Info_ClearChoices (DIA_AmbientNPC_PickPocket);
    };
    
    
    // ****************************************************************
    // ----------------------------------------------------------------
    
    
    func void DIV_AmbientNPC_PickPocket(var C_NPC slf)
    {
        DIA_AmbientNPC_PickPocket_Exit.npc = Hlp_GetInstanceID(slf);
        DIA_AmbientNPC_PickPocket.npc        = Hlp_GetInstanceID(slf);
    
    
        if (!slf.aivar[AIV_PPNPCREMEMBERITEM])
        {
            handle = new(string@);
            str = get(handle);
            
            str.s = "MyString";
        
            if           (Hlp_Random (210) <= 5)                                 { str.s = "ItPo_DIV_Gegengift";         slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) >  5) && (Hlp_Random (210) <= 10)    { str.s = "ItPo_Mana_01";                 slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 10) && (Hlp_Random (210) <= 15)   { str.s = "ItPo_Mana_02";                slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 15) && (Hlp_Random (210) <= 20)   { str.s = "ItPo_Health_01";                slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 20) && (Hlp_Random (210) <= 25)   { str.s = "ItPo_Health_02";                 slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 25) && (Hlp_Random (210) <= 30)   { str.s = "ItPo_Health_03";                slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            
            } else if (Hlp_Random (210) > 30) && (Hlp_Random (210) <= 35)   { str.s = "ItMi_DIV_GoldChest";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 35) && (Hlp_Random (210) <= 40)   { str.s = "ItMi_JeweleryChest";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 40) && (Hlp_Random (210) <= 45)   { str.s = "ItMi_DIV_GoldChalice";        slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 45) && (Hlp_Random (210) <= 50)   { str.s = "ItMi_DIV_GoldPlate";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            
            } else if (Hlp_Random (210) > 50) && (Hlp_Random (210) <= 60)   { str.s = "ItMi_Gold";                    slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 60) && (Hlp_Random (210) <= 70)   { str.s = "ItMi_InnosStatue";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 70) && (Hlp_Random (210) <= 80)   { str.s = "ItMi_Rockcrystal";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 80) && (Hlp_Random (210) <= 90)   { str.s = "ItMi_SilverNecklace";        slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 90) && (Hlp_Random (210) <= 100)  { str.s = "ItMi_SilverRing";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 100)&& (Hlp_Random (210) <= 110)  { str.s = "ItMi_Aquamarine";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 110)&& (Hlp_Random (210) <= 120)  { str.s = "ItMi_DarkPearl";                slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 120) && (Hlp_Random (210) <= 130) { str.s = "ItMi_Lute";                    slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 130) && (Hlp_Random (210) <= 140) { str.s = "ItMi_DIV_Bar_Iron";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 140) && (Hlp_Random (210) <= 150) { str.s = "ItMi_Joint";                    slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            
            } else if (Hlp_Random (210) > 150) && (Hlp_Random (210) <= 165) { str.s = "ItMi_Pitch";                    slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 165) && (Hlp_Random (210) <= 180) { str.s = "ItMi_DIV_Teller";            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            } else if (Hlp_Random (210) > 180) && (Hlp_Random (210) <= 195) { str.s = "ItMi_DIV_NakedWomanPicture";    slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
            
            } else                                                             { str.s = "ItMi_Quartz";                 slf.aivar[AIV_PPNPCREMEMBERITEM] = handle; };
        
            var int id; id = MEM_FindParserSymbol(str.s);
            
            var int itmPtr; itmPtr = Itm_GetPtr(id);
            var C_Item itm; itm = MEM_PtrToInst(itmPtr);
        
            if (Hlp_IsItem (itm, ItMi_Gold))
            { 
                slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = Hlp_Random (34);
            
            } else {
            
                slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = Hlp_Random (2);
            };
            
            if (slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] < 1)
            {
                slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = 1;
            };
        };
        
        Print (str.s);
    
    
        TheftItem_PrintName = Itm_GetPtr(id);
    
    
        var oCItem TheftItemName;
        TheftItemName = MEM_PtrToInst(TheftItem_PrintName);
    
    
        var string TheftString1; TheftString1 = ConcatStrings ("(Versuchen, dieser Person ", IntToString(slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]));
        var string TheftString2; TheftString2 = ConcatStrings ("x ", TheftItemName.description);
        
        var string TheftString_All_PI;  TheftString_All_PI  = ConcatStrings (TheftString1, TheftString2);
    
    
            // var string TheftString_All_PII; TheftString_All_PII = ConcatStrings (" zu stehlen.)", " "); 
        
        var string TheftString_All;        TheftString_All     = ConcatStrings (TheftString_All_PI, " zu stehlen.)");
        
        DIA_AmbientNPC_PickPocket.description = TheftString_All;
    };
    
    
    func void DIA_AmbientNPC_PickPocket_DoIt()
    {
        if (Hlp_Random (100) < other.attribute[ATR_DEXTERITY]+5)
        {
            // var int id; id = MEM_FindParserSymbol(str.s);
            
            id = MEM_FindParserSymbol(str.s);
        
            CreateInvItems                (self,          id, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
            B_GiveInvItems_NoAnimation (self, other, id, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
            
            if (self.aivar[AIV_PPNPCREMEMBERITEM] == ItMi_Gold)
            {
                Npc_RemoveInvItems (self, ItMi_Gold, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
            };
            
            self.aivar[AIV_PlayerHasPickedMyPocket] = TRUE;
            
            B_GivePlayerXP (5 * self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
            
            Snd_Play ("Geldbeutel");
            
            DIV_MerkeErfolgreichenTaschendiebstahl = DIV_MerkeErfolgreichenTaschendiebstahl +1;
            
        } else {
            
            AI_StopProcessInfos    (self);
            
            B_Attack (self, other, AR_Theft, 1);
        };
            
        if (DIV_MerkeErfolgreichenTaschendiebstahl >= 10)
        {
            Npc_ChangeAttribute (other, ATR_DEXTERITY, 1);
    
    
            AI_PrintS_Ext (other, "Geschicklichkeit +1", COL_Green);
            Snd_Play  ("VEL_QUEST_SUCCESS");
    
    
            DIV_MerkeErfolgreichenTaschendiebstahl = 0;
        };
        
        Info_ClearChoices (DIA_AmbientNPC_PickPocket);
        
        AI_StopProcessInfos    (self);
    };
    zSpy meldet nach dem neuladen auch wieder etwas, sobald ein entsprechender NPC angesprochen wird. Scheint, Als würde da tatsächlich irgendetwas mit dem handle noch nicht ganz passen...

    Code:
    00:25 Info:  2 U:    PAR: Adressing an empty Instance : _STRING.S .... <zParser_Symbol.cpp,#365>00:25 Warn:  0 M:     Invalid item (no name, no instance) put into inventory. Deleting it. .... <oInventory.cpp,#2967>
    00:25 Warn:  0 M:     Invalid item (no name, no instance) put into inventory. Deleting it. .... <oInventory.cpp,#2967>
    00:25 Info:  2 U:    PAR: Adressing an empty Instance : C_ITEM.NAME .... <zParser_Symbol.cpp,#365>

    Edit: Ändere ich es so ab, wie du geschrieben hast, ist zumindest im Dialogfenster das Item nicht mehr leer, trotzdem wird mir noch ein leeres Item beim Diebstahl übergeben. Da nun so auch zSpy nicht mehr meckert und ich ein wirklich leeres Item ins Inventar bekomme, das auch nicht wieder gelöscht wird... Kann es sein, dass der Funktion DIA_AmbientNPC_PickPocket_DoIt die Item-ID nicht oder nicht richtig übergeben wird?

    Edit2: So... Ich habe noch etwas herumprobiert, jetzt wird nach dem neuladen eines Spielstandes ein Item in der Dialogbeschreibung angezeigt und auch das richtige Item übergeben. Die Dialogbeschreibung nimmt nun allerdings nach dem neuladen ein komplett anderes Item in den Text, das eigentlich vor dem Speichern gar kein NPC zum stehlen hatte. Vermutlich habe ich nur noch etwas übersehen, ich schaue gleich noch mal. Auch Hlp_IsValidHandle werde ich mal probieren. Hier jedenfalls der aktuellste Code, der so ziemlich funktioniert, bis auf diese beiden Probleme:

    Code:
    // *************************// DIV_AmbientNPC_PickPocket
    // *************************
    var int TheftItem_PrintName;
    
    
    //var int handle; //handle = new(string@); // Ein neues Objekt der Klasse _string anlegen
    	
    //var _string str;
    
    
    
    
    func int DIV_Cond_Pickpocket ()
    {
    	if (Npc_GetTalentSkill (other, NPC_TALENT_PICKPOCKET) == TRUE) 
    	&& (self.aivar[AIV_PlayerHasPickedMyPocket] 		  == FALSE)
    	{
    		if (Npc_IsInState (self, ZS_Talk))
    		{
    			return TRUE;
    		};
    	};
    };
    
    
    // *************************************************************************
    // 									EXIT
    // *************************************************************************
    instance DIA_AmbientNPC_PickPocket_Exit(C_INFO)
    {
    	nr			= 999;
    	condition	= DIA_AmbientNPC_PickPocket_Exit_Condition;
    	information	= DIA_AmbientNPC_PickPocket_Exit_Info;
    	permanent	= TRUE;
    	description = DIALOG_ENDE;
    };                       
    
    
    FUNC INT DIA_AmbientNPC_PickPocket_Exit_Condition()
    {
    	if (Npc_GetTalentSkill (hero, NPC_TALENT_PICKPOCKET) == TRUE)
    	&& (self.aivar[AIV_PlayerHasPickedMyPocket] == FALSE)
    	
    	&& (self.aivar[AIV_PARTYMEMBER] == FALSE)
    	&& (self.npctype 				!= NPCTYPE_MAIN)
    	&& (self.npctype 				!= NPCTYPE_FRIEND)
    	
    	&& (self.aivar[AIV_AMBIENTNPCHASENDDIALOG] == FALSE)
    	{
    		return TRUE;
    	};
    };
    
    
    FUNC VOID DIA_AmbientNPC_PickPocket_Exit_Info()
    {	
    	AI_StopProcessInfos	(self);
    };
    
    
    // ------------------------------------------------------
    instance DIA_AmbientNPC_PickPocket(C_INFO)
    {
    
    
    	nr			= 900;
    	condition	= DIA_AmbientNPC_PickPocket_Condition;
    	information	= DIA_AmbientNPC_PickPocket_Info;
    	permanent	= TRUE;
    };
    FUNC INT DIA_AmbientNPC_PickPocket_Condition()
    {
    	if (self.aivar[AIV_PARTYMEMBER] == FALSE)
    	&& (self.npctype 				!= NPCTYPE_FRIEND)
    	{
    		DIV_Cond_Pickpocket();
    	};
    };
    func VOID DIA_AmbientNPC_PickPocket_Info()
    {	
    	Info_ClearChoices	(DIA_AmbientNPC_PickPocket													 );
    	Info_AddChoice		(DIA_AmbientNPC_PickPocket, DIALOG_BACK 	 , DIA_AmbientNPC_PickPocket_BACK);
    	Info_AddChoice		(DIA_AmbientNPC_PickPocket, DIALOG_PICKPOCKET, DIA_AmbientNPC_PickPocket_DoIt);
    };
    
    
    func void DIA_AmbientNPC_PickPocket_BACK()
    {
    	Info_ClearChoices (DIA_AmbientNPC_PickPocket);
    };
    
    
    // ****************************************************************
    // ----------------------------------------------------------------
    
    
    func void DIV_AmbientNPC_PickPocket(var C_NPC slf)
    {
    	DIA_AmbientNPC_PickPocket_Exit.npc = Hlp_GetInstanceID(slf);
    	DIA_AmbientNPC_PickPocket.npc 	   = Hlp_GetInstanceID(slf);
    
    
    	if (!slf.aivar[AIV_PPNPCREMEMBERITEM])
    	{
    		slf.aivar[AIV_PPNPCREMEMBERITEM] = new(string@);
    		var _string str; str = get(slf.aivar[AIV_PPNPCREMEMBERITEM]);
    		
    		str.s = "MyString";
    	
    		if 		  (Hlp_Random (210) <= 5)						 		{ str.s = "ItPo_DIV_Gegengift"; 		slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) >  5) && (Hlp_Random (210) <= 10)	{ str.s = "ItPo_Mana_01"; 				slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 10) && (Hlp_Random (210) <= 15)   { str.s = "ItPo_Mana_02";				slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 15) && (Hlp_Random (210) <= 20)   { str.s = "ItPo_Health_01";				slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 20) && (Hlp_Random (210) <= 25)   { str.s = "ItPo_Health_02";	 			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 25) && (Hlp_Random (210) <= 30)   { str.s = "ItPo_Health_03";				slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		
    		} else if (Hlp_Random (210) > 30) && (Hlp_Random (210) <= 35)   { str.s = "ItMi_DIV_GoldChest";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 35) && (Hlp_Random (210) <= 40)   { str.s = "ItMi_JeweleryChest";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 40) && (Hlp_Random (210) <= 45)   { str.s = "ItMi_DIV_GoldChalice";		slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 45) && (Hlp_Random (210) <= 50)   { str.s = "ItMi_DIV_GoldPlate";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		
    		} else if (Hlp_Random (210) > 50) && (Hlp_Random (210) <= 60)   { str.s = "ItMi_Gold";					slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 60) && (Hlp_Random (210) <= 70)   { str.s = "ItMi_InnosStatue";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 70) && (Hlp_Random (210) <= 80)   { str.s = "ItMi_Rockcrystal";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 80) && (Hlp_Random (210) <= 90)   { str.s = "ItMi_SilverNecklace";		slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 90) && (Hlp_Random (210) <= 100)  { str.s = "ItMi_SilverRing";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 100)&& (Hlp_Random (210) <= 110)  { str.s = "ItMi_Aquamarine";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 110)&& (Hlp_Random (210) <= 120)  { str.s = "ItMi_DarkPearl";				slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 120) && (Hlp_Random (210) <= 130) { str.s = "ItMi_Lute";					slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 130) && (Hlp_Random (210) <= 140) { str.s = "ItMi_DIV_Bar_Iron";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 140) && (Hlp_Random (210) <= 150) { str.s = "ItMi_Joint";					slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		
    		} else if (Hlp_Random (210) > 150) && (Hlp_Random (210) <= 165) { str.s = "ItMi_Pitch";					slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 165) && (Hlp_Random (210) <= 180) { str.s = "ItMi_DIV_Teller";			slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		} else if (Hlp_Random (210) > 180) && (Hlp_Random (210) <= 195) { str.s = "ItMi_DIV_NakedWomanPicture";	slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM];
    		
    		} else 															{ str.s = "ItMi_Quartz"; 				slf.aivar[AIV_PPNPCREMEMBERITEM] = slf.aivar[AIV_PPNPCREMEMBERITEM]; };
    	
    		var int id; id = MEM_FindParserSymbol(str.s);
    		
    		var int itmPtr; itmPtr = Itm_GetPtr(id);
    		var C_Item itm; itm = MEM_PtrToInst(itmPtr);
    	
    		if (Hlp_IsItem (itm, ItMi_Gold))
    		{ 
    			slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = Hlp_Random (34);
    		
    		} else {
    		
    			slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = Hlp_Random (2);
    		};
    		
    		if (slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] < 1)
    		{
    			slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = 1;
    		};
    	};
    	
    	Print (str.s);
    
    
    	TheftItem_PrintName = Itm_GetPtr(id);
    
    
    	var oCItem TheftItemName;
    	TheftItemName = MEM_PtrToInst(TheftItem_PrintName);
    
    
    	var string TheftString1; TheftString1 = ConcatStrings ("(Versuchen, dieser Person ", IntToString(slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]));
    	var string TheftString2; TheftString2 = ConcatStrings ("x ", TheftItemName.description);
    	
    	var string TheftString_All_PI;  TheftString_All_PI  = ConcatStrings (TheftString1, TheftString2);
    
    
    		// var string TheftString_All_PII; TheftString_All_PII = ConcatStrings (" zu stehlen.)", " "); 
    	
    	var string TheftString_All;		TheftString_All 	= ConcatStrings (TheftString_All_PI, " zu stehlen.)");
    	
    	DIA_AmbientNPC_PickPocket.description = TheftString_All;
    };
    
    
    func void DIA_AmbientNPC_PickPocket_DoIt()
    {
    	if (Hlp_Random (100) < other.attribute[ATR_DEXTERITY]+5)
    	{
    	
    		var _string str; str = get(self.aivar[AIV_PPNPCREMEMBERITEM]);
    		var int id; id = MEM_FindParserSymbol(str.s);
    	
    		CreateInvItems 			   (self, 		 id, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
    		B_GiveInvItems_NoAnimation (self, other, id, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
    		
    		if (self.aivar[AIV_PPNPCREMEMBERITEM] == ItMi_Gold)
    		{
    			Npc_RemoveInvItems (self, ItMi_Gold, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
    		};
    		
    		self.aivar[AIV_PlayerHasPickedMyPocket] = TRUE;
    		
    		B_GivePlayerXP (5 * self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
    		
    		Snd_Play ("Geldbeutel");
    		
    		DIV_MerkeErfolgreichenTaschendiebstahl = DIV_MerkeErfolgreichenTaschendiebstahl +1;
    		
    	} else {
    		
    		AI_StopProcessInfos	(self);
    		
    		B_Attack (self, other, AR_Theft, 1);
    	};
    		
    	if (DIV_MerkeErfolgreichenTaschendiebstahl >= 10)
    	{
    		Npc_ChangeAttribute (other, ATR_DEXTERITY, 1);
    
    
    		AI_PrintS_Ext (other, "Geschicklichkeit +1", COL_Green);
    		Snd_Play  ("VEL_QUEST_SUCCESS");
    
    
    		DIV_MerkeErfolgreichenTaschendiebstahl = 0;
    	};
    	
    	Info_ClearChoices (DIA_AmbientNPC_PickPocket);
    	
    	AI_StopProcessInfos	(self);
    };
    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Du könntest möglicherweise mit Hlp_IsValidHandle(int) abfragen ob schon einmal das Diebstahl item festgelegt wurde.
    Aber ich glaube du speicherst das handle noch nicht richtig.
    [Falls du da wirklich eine Variable "handle" verwendest im Sinne von
    Code:
    var int handle; handle = new(string@);
    Das "handle", Sprich: Die Zahl die von der Funktion new() zurückgegeben wird, solltest du wahrscheinlich in slf.aivar[AIV_PPNPCREMEMBERITEM] abspeichern und dann später auch darauf zugreifen etwa so:
    Code:
    slf.aivar[AIV_PPNPCREMEMBERITEM] = new(string@);
    [...]
    [hier jetzt das neu erstellte objekt, beziehungsweise den darin enthaltenen string sinnvoll befüllen]
    [...]
    var _string str; str = get(slf.aivar[AIV_PPNPCREMEMBERITEM]);
    print(str.s);
    ]
    Zeig bitte noch mal deinen kompletten code wie er jetzt ist.
    Geändert von Bloodfly91 (01.06.2019 um 22:03 Uhr)

  15. Beiträge anzeigen #15 Zitieren
    Knight
    Registriert seit
    Aug 2009
    Ort
    Hessen
    Beiträge
    1.484
     
    Cryp18Struct ist offline
    Mal etwas losgelöst von deinem jetzigem Problem versuche ich gerade mal zu erklären was ein handle ist(Lehona kann das evt. besser als ich):

    Jedem von PermMem verwaltetem Objekt ist eine Zahl zugeordnet welche eindeutig identifiziert welches von PermMem verwaltete Objekt ich gerade bearbeiten möchte.
    Dies ist das "handle" des Objekts.
    Sprich: Wenn du ein neues PermMem Objekt erstellst, bekommst du eine Zahl zurück welche du später verwenden kannst um auf genau dieses Objekt zuzugreifen.
    [Wenn du zum ersten Mal ein PermMem Objekt erstellst bekommst du eine 1 zurück und kannst dann später PermMem anweisen "Gib mir mal das 1. Objekt das du verwaltest!". Wenn du zum zweiten mal ein PermMem Objekt erstellst bekommst du eine 2 zurück und kannst dann später PermMem anweisen "Gib mir mal das 2. Objekt das du verwaltest!".
    [...]
    Welche Zahl genau zurück gegeben wird, wenn du ein neues PermMem Objekt erstellst, kann dir egal sein. Du musst es nur irgendwo speichern, damit du später wieder auf genau dieses Objekt zugreifen kannst.]

    Nehmen wir mal an du möchtest einen string als PermMem Objekt speichern.
    Da könntest du dir eine integer Variable deklarieren in welcher das handle gespeichert werden soll:
    Code:
    var int handleEinesSpezifischen_Strings; // globale Variable, hier landet eine Zahl(Ist es das 1. oder das 2. oder das 3. ... Objekt das von PermMem verwaltet wird?)
    
    func void speichereStringMitPermMem(){
        handleEinesSpezifischen_Strings = new(string@); // Ein neues Objekt der Klasse _string anlegen[_string ist nicht das gleiche wie string!] und in der Variable "handleEinesSpezifischen_Strings" abspeichern das wievielte PermMem Objekt es ist
        var _string permMemObjekt; permMemObjekt = get(handleEinesSpezifischen_Strings); // PermMem! Gib mir eine Referenz auf das von dir verwaltete Objekt das mit der Zahl "handleEinesSpezifischen_Strings" zu tun hat. Ich weiss das ist vom Typ _string (NICHT string)
        
        permMemObjekt.s = "Hallo!";  //In dem string(Innerhalb des von PermMem verwaltetem _string Objekt) wird ein Wert gespeichert.
    
    };
    
    func void LesePermMemString(){
        if(!Hlp_IsValidHandle(handleEinesSpezifischen_Strings)){
            print("Unter der Nummer handleEinesSpezifischen_Strings wird zurzeit gar kein Objekt von PermMem verwaltet! ABBRUCH!");
            return;
        }else{
            var _string permMemObjekt; permMemObjekt = get(handleEinesSpezifischen_Strings); // PermMem! Gib mir eine Referenz auf das von dir verwaltete Objekt das mit der Zahl "handleEinesSpezifischen_Strings" zu tun hat. Ich weiss das ist vom Typ _string (NICHT string)
            print(permMemObjekt.s); // Den string(Innerhalb des von PermMem verwaltetem _string Objekt) auf dem Bildschirm ausgeben
        };
    };
    Auf die gleiche Art und Weise kannst du dir für jeden NPC ein von PermMem verwaltetes _string Objekt erstellen. Dir wird dann beim erstellen des Objekts mit der Funktion new() eine Zahl zurück geliefert die du speichern musst um später auf dieses _string Objekt zugreifen zu können.
    Diese Zahl(Das handle!) kannst du im aivar array des NPCs speichern.

    Falls das noch zu wirr ist als Erklärung, sag es einfach.

  16. Homepage besuchen Beiträge anzeigen #16 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Vielen Dank für die Erklärung! Das sieht definitiv verständlich aus, würde mir das aber erst morgen noch mal genauer durchlesen und dann auch weiter herumprobieren, wenn ich wieder klarer denken kann.
    Hätte übrigens echt nicht gedacht, dass ich so viel Zeit mit diesem, denke ich jedenfalls, doch eigentlich relativ simplen Vorhaben verbringen werde. Ist nun immerhin schon der dritte Tag, den ich mit nur diesem einen Skript verbringe. Ich habe, als ich damit begann, mit höchstens ein paar Stunden Arbeitszeit gerechnet...

    Zitat Zitat von Cryp18Struct Beitrag anzeigen
    Mal etwas losgelöst von deinem jetzigem Problem versuche ich gerade mal zu erklären was ein handle ist(Lehona kann das evt. besser als ich):

    Jedem von PermMem verwaltetem Objekt ist eine Zahl zugeordnet welche eindeutig identifiziert welches von PermMem verwaltete Objekt ich gerade bearbeiten möchte.
    Dies ist das "handle" des Objekts.
    Sprich: Wenn du ein neues PermMem Objekt erstellst, bekommst du eine Zahl zurück welche du später verwenden kannst um auf genau dieses Objekt zuzugreifen.
    [Wenn du zum ersten Mal ein PermMem Objekt erstellst bekommst du eine 1 zurück und kannst dann später PermMem anweisen "Gib mir mal das 1. Objekt das du verwaltest!". Wenn du zum zweiten mal ein PermMem Objekt erstellst bekommst du eine 2 zurück und kannst dann später PermMem anweisen "Gib mir mal das 2. Objekt das du verwaltest!".
    [...]
    Welche Zahl genau zurück gegeben wird, wenn du ein neues PermMem Objekt erstellst, kann dir egal sein. Du musst es nur irgendwo speichern, damit du später wieder auf genau dieses Objekt zugreifen kannst.]

    Nehmen wir mal an du möchtest einen string als PermMem Objekt speichern.
    Da könntest du dir eine integer Variable deklarieren in welcher das handle gespeichert werden soll:
    Code:
    var int handleEinesSpezifischen_Strings; // globale Variable, hier landet eine Zahl(Ist es das 1. oder das 2. oder das 3. ... Objekt das von PermMem verwaltet wird?)
    
    func void speichereStringMitPermMem(){
        handleEinesSpezifischen_Strings = new(string@); // Ein neues Objekt der Klasse _string anlegen[_string ist nicht das gleiche wie string!] und in der Variable "handleEinesSpezifischen_Strings" abspeichern das wievielte PermMem Objekt es ist
        var _string permMemObjekt; permMemObjekt = get(handleEinesSpezifischen_Strings); // PermMem! Gib mir eine Referenz auf das von dir verwaltete Objekt das mit der Zahl "handleEinesSpezifischen_Strings" zu tun hat. Ich weiss das ist vom Typ _string (NICHT string)
        
        permMemObjekt.s = "Hallo!";  //In dem string(Innerhalb des von PermMem verwaltetem _string Objekt) wird ein Wert gespeichert.
    
    };
    
    func void LesePermMemString(){
        if(!Hlp_IsValidHandle(handleEinesSpezifischen_Strings)){
            print("Unter der Nummer handleEinesSpezifischen_Strings wird zurzeit gar kein Objekt von PermMem verwaltet! ABBRUCH!");
            return;
        }else{
            var _string permMemObjekt; permMemObjekt = get(handleEinesSpezifischen_Strings); // PermMem! Gib mir eine Referenz auf das von dir verwaltete Objekt das mit der Zahl "handleEinesSpezifischen_Strings" zu tun hat. Ich weiss das ist vom Typ _string (NICHT string)
            print(permMemObjekt.s); // Den string(Innerhalb des von PermMem verwaltetem _string Objekt) auf dem Bildschirm ausgeben
        };
    };
    Auf die gleiche Art und Weise kannst du dir für jeden NPC ein von PermMem verwaltetes _string Objekt erstellen. Dir wird dann beim erstellen des Objekts mit der Funktion new() eine Zahl zurück geliefert die du speichern musst um später auf dieses _string Objekt zugreifen zu können.
    Diese Zahl(Das handle!) kannst du im aivar array des NPCs speichern.

    Falls das noch zu wirr ist als Erklärung, sag es einfach.

  17. Beiträge anzeigen #17 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.446
     
    Lehona ist offline
    Du bist nicht so weit von einer Lösung entfernt, aber es gibt noch ein bisschen durcheinander im Script, was die Reihenfolge u.ä. betrifft. Ich habe das mal ein bisschen aufgeräumt.

    Code:
    func string RandomItemForPickpocket() {
        var int random; random = Hlp_Random(210);
        var string itemInst;
        if        (random <= 5)                     { itemInst = "ItPo_DIV_Gegengift";
        } else if (random >  5) && (random <= 10)   { itemInst = "ItPo_Mana_01";
        } else if (random > 10) && (random <= 15)   { itemInst = "ItPo_Mana_02";
        } else if (random > 15) && (random <= 20)   { itemInst = "ItPo_Health_01";
        } else if (random > 20) && (random <= 25)   { itemInst = "ItPo_Health_02";
        } else if (random > 25) && (random <= 30)   { itemInst = "ItPo_Health_03";
        } else if (random > 30) && (random <= 35)   { itemInst = "ItMi_DIV_GoldChest";
        } else if (random > 35) && (random <= 40)   { itemInst = "ItMi_JeweleryChest";
        } else if (random > 40) && (random <= 45)   { itemInst = "ItMi_DIV_GoldChalice";
        } else if (random > 45) && (random <= 50)   { itemInst = "ItMi_DIV_GoldPlate";
        } else if (random > 50) && (random <= 60)   { itemInst = "ItMi_Gold";
        } else if (random > 60) && (random <= 70)   { itemInst = "ItMi_InnosStatue";
        } else if (random > 70) && (random <= 80)   { itemInst = "ItMi_Rockcrystal";
        } else if (random > 80) && (random <= 90)   { itemInst = "ItMi_SilverNecklace";
        } else if (random > 90) && (random <= 100)  { itemInst = "ItMi_SilverRing";
        } else if (random > 100)&& (random <= 110)  { itemInst = "ItMi_Aquamarine";
        } else if (random > 110)&& (random <= 120)  { itemInst = "ItMi_DarkPearl";
        } else if (random > 120) && (random <= 130) { itemInst = "ItMi_Lute";
        } else if (random > 130) && (random <= 140) { itemInst = "ItMi_DIV_Bar_Iron";
        } else if (random > 140) && (random <= 150) { itemInst = "ItMi_Joint";
        } else if (random > 150) && (random <= 165) { itemInst = "ItMi_Pitch";
        } else if (random > 165) && (random <= 180) { itemInst = "ItMi_DIV_Teller";
        } else if (random > 180) && (random <= 195) { itemInst = "ItMi_DIV_NakedWomanPicture";
        } else                                      { itemInst = "ItMi_Quartz";
        };
        
        return itemInst;
    };
    
    func int GetPickpocketAmount(var string itemInst) {
        var int id; id = MEM_FindParserSymbol(itemInst);
        var int itmPtr; itmPtr = Itm_GetPtr(id);
        var C_Item itm; itm = MEM_PtrToInst(itmPtr);
        var int amount;
        
        if (Hlp_IsItem (itm, ItMi_Gold)) {
            amount = Hlp_Random (34);
        } else {
            amount = Hlp_Random (2);
        };
        
        if (amount < 1)
        {
            amount = 1;
        };
        return amount;
    };
    
    func int GetPickpocketHandle(var c_npc slf) {
        var _string str; var int handle;
        if (!slf.aivar[AIV_PPNPCREMEMBERITEM])
        {
            handle = new(string@);
            str = get(handle);
        
            str.s = RandomItemForPickpocket();
            slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = GetPickpocketAmount(str.s);
            slf.aivar[AIV_PPNPCREMEMBERITEM] = handle;
        };
        
        return slf.aivar[AIV_PPNPCREMEMBERITEM];
    };
    
    func void GetPickpocketDescription(var string itemName, var int amount) {
        var string TheftString1; TheftString1 = ConcatStrings ("(Versuchen, dieser Person ", IntToString(amount));
        var string TheftString2; TheftString2 = ConcatStrings ("x ", itemName);
        
        var string TheftString_All_PI; TheftString_All_PI  = ConcatStrings (TheftString1, TheftString2);
        var string TheftString_All; TheftString_All     = ConcatStrings (TheftString_All_PI, " zu stehlen.)");
        
        return TheftString_All;
    };
    
    func void DIV_AmbientNPC_PickPocket(var C_NPC slf)
    {
        DIA_AmbientNPC_PickPocket_Exit.npc = Hlp_GetInstanceID(slf);
        DIA_AmbientNPC_PickPocket.npc        = Hlp_GetInstanceID(slf);
        var _string str; var int handle;
        
        handle = GetPickpocketHandle(slf);
        str = get(handle);
    
        var int id; id = MEM_FindParserSymbol(str.s);
        
        var int itmPtr; itmPtr = Itm_GetPtr(id);
        var C_Item itm; itm = MEM_PtrToInst(itmPtr);
        var int amount = slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT];
        
        DIA_AmbientNPC_PickPocket.description = GetPickpocketDescription(itm.description, amount);
    };
    Das ist ungetestet, aber ich denke durch die ein bisschen feinere Aufteilung in mehrere Funktionen lässt sich das ganz gut überblicken.

    Edit: Und jetzt auch mit Leerzeichen anstatt Tabs, dann sieht's sogar hier im Forum halbwegs gut aus.

  18. Homepage besuchen Beiträge anzeigen #18 Zitieren
    Team Velen
    Registriert seit
    Aug 2015
    Beiträge
    952
     
    Bloodfly91 ist offline
    Wow, super. Vielen Dank! Mit deinem Code funktioniert es nun einwandfrei, auch nach dem laden und speichern eines Spielstandes!
    Auch noch mal vielen Dank an dich, Cryp18Struct, für deine gute Erklärung zu PermMem und was ein handle ist!

    Hier noch mal das komplette Skript, in seinem jetzigen, funktionierenden Zustand, für diejenigen, die es eventuell auch in ihre Modifikation einbauen wollen:

    Code:
    // *************************// DIV_AmbientNPC_PickPocket
    // *************************
    
    
    func int DIV_Cond_Pickpocket ()
    {
        if (Npc_GetTalentSkill (other, NPC_TALENT_PICKPOCKET) == TRUE) 
        && (self.aivar[AIV_PlayerHasPickedMyPocket]           == FALSE)
        {
            if (Npc_IsInState (self, ZS_Talk))
            {
                return TRUE;
            };
        };
    };
    
    
    func string RandomItemForPickpocket() 
    {
        var int random; random = Hlp_Random(210);
        var string itemInst;
        
        if        (random <= 5)                     { itemInst = "ItPo_DIV_Gegengift";
        } else if (random >  5)  && (random <= 10)  { itemInst = "ItPo_Mana_01";
        } else if (random > 10)  && (random <= 15)  { itemInst = "ItPo_Mana_02";
        } else if (random > 15)  && (random <= 20)  { itemInst = "ItPo_Health_01";
        } else if (random > 20)  && (random <= 25)  { itemInst = "ItPo_Health_02";
        } else if (random > 25)  && (random <= 30)  { itemInst = "ItPo_Health_03";
        } else if (random > 30)  && (random <= 35)  { itemInst = "ItMi_DIV_GoldChest";
        } else if (random > 35)  && (random <= 40)  { itemInst = "ItMi_JeweleryChest";
        } else if (random > 40)  && (random <= 45)  { itemInst = "ItMi_DIV_GoldChalice";
        } else if (random > 45)  && (random <= 50)  { itemInst = "ItMi_DIV_GoldPlate";
        } else if (random > 50)  && (random <= 60)  { itemInst = "ItMi_Gold";
        } else if (random > 60)  && (random <= 70)  { itemInst = "ItMi_InnosStatue";
        } else if (random > 70)  && (random <= 80)  { itemInst = "ItMi_Rockcrystal";
        } else if (random > 80)  && (random <= 90)  { itemInst = "ItMi_SilverNecklace";
        } else if (random > 90)  && (random <= 100) { itemInst = "ItMi_SilverRing";
        } else if (random > 100) && (random <= 110) { itemInst = "ItMi_Aquamarine";
        } else if (random > 110) && (random <= 120) { itemInst = "ItMi_DarkPearl";
        } else if (random > 120) && (random <= 130) { itemInst = "ItMi_Lute";
        } else if (random > 130) && (random <= 140) { itemInst = "ItMi_DIV_Bar_Iron";
        } else if (random > 140) && (random <= 150) { itemInst = "ItMi_Joint";
        } else if (random > 150) && (random <= 165) { itemInst = "ItMi_Pitch";
        } else if (random > 165) && (random <= 180) { itemInst = "ItMi_DIV_Teller";
        } else if (random > 180) && (random <= 195) { itemInst = "ItMi_DIV_NakedWomanPicture";
        } else                                      { itemInst = "ItMi_Quartz";
        };
        
        return itemInst;
    };
    
    
    func int GetPickpocketAmount(var string itemInst) 
    {
        var int id; id = MEM_FindParserSymbol(itemInst);
        var int itmPtr; itmPtr = Itm_GetPtr(id);
        var C_Item itm; itm = MEM_PtrToInst(itmPtr);
        
        var int amount;
        
        if (Hlp_IsItem (itm, ItMi_Gold)) 
        {
            amount = Hlp_Random (34);
            
        } else {
        
            amount = Hlp_Random (2);
        };
        
        if (amount < 1)
        {
            amount = 1;
        };
        
        return amount;
    };
    
    
    func int GetPickpocketHandle(var c_npc slf) 
    {
        var _string str; var int handle;
        if (!slf.aivar[AIV_PPNPCREMEMBERITEM])
        {
            handle = new(string@);
            str = get(handle);
        
            str.s = RandomItemForPickpocket();
            slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT] = GetPickpocketAmount(str.s);
            slf.aivar[AIV_PPNPCREMEMBERITEM]        = handle;
        };
        
        return slf.aivar[AIV_PPNPCREMEMBERITEM];
    };
    
    
    func string GetPickpocketDescription(var string itemName, var int amount) 
    {
        var string TheftString1; TheftString1 = ConcatStrings ("(Versuchen, dieser Person ", IntToString(amount));
        var string TheftString2; TheftString2 = ConcatStrings ("x ", itemName);
        
        var string TheftString_All_PI; TheftString_All_PI = ConcatStrings (TheftString1, TheftString2);
        var string TheftString_All;    TheftString_All    = ConcatStrings (TheftString_All_PI, " zu stehlen.)");
        
        return TheftString_All;
    };
    
    
    // *************************************************************************
    //                                     EXIT
    // *************************************************************************
    instance DIA_AmbientNPC_PickPocket_Exit(C_INFO)
    {
        nr            = 999;
        condition    = DIA_AmbientNPC_PickPocket_Exit_Condition;
        information    = DIA_AmbientNPC_PickPocket_Exit_Info;
        permanent    = TRUE;
        description = DIALOG_ENDE;
    };                       
    
    
    FUNC INT DIA_AmbientNPC_PickPocket_Exit_Condition()
    {
        if (Npc_GetTalentSkill (hero, NPC_TALENT_PICKPOCKET) == TRUE)
        && (self.aivar[AIV_PlayerHasPickedMyPocket] == FALSE)
        
        && (self.aivar[AIV_PARTYMEMBER] == FALSE)
        && (self.npctype                 != NPCTYPE_MAIN)
        && (self.npctype                 != NPCTYPE_FRIEND)
        
        && (self.aivar[AIV_AMBIENTNPCHASENDDIALOG] == FALSE)
        {
            return TRUE;
        };
    };
    
    
    FUNC VOID DIA_AmbientNPC_PickPocket_Exit_Info()
    {    
        AI_StopProcessInfos    (self);
    };
    
    
    // ------------------------------------------------------
    instance DIA_AmbientNPC_PickPocket(C_INFO)
    {
    
    
        nr            = 900;
        condition    = DIA_AmbientNPC_PickPocket_Condition;
        information    = DIA_AmbientNPC_PickPocket_Info;
        permanent    = TRUE;
    };
    FUNC INT DIA_AmbientNPC_PickPocket_Condition()
    {
        if (self.aivar[AIV_PARTYMEMBER] == FALSE)
        && (self.npctype                 != NPCTYPE_FRIEND)
        {
            DIV_Cond_Pickpocket();
        };
    };
    func VOID DIA_AmbientNPC_PickPocket_Info()
    {    
        Info_ClearChoices    (DIA_AmbientNPC_PickPocket                                                     );
        Info_AddChoice        (DIA_AmbientNPC_PickPocket, DIALOG_BACK      , DIA_AmbientNPC_PickPocket_BACK);
        Info_AddChoice        (DIA_AmbientNPC_PickPocket, DIALOG_PICKPOCKET, DIA_AmbientNPC_PickPocket_DoIt);
    };
    
    
    func void DIA_AmbientNPC_PickPocket_DoIt()
    {
        if (Hlp_Random (105) < other.attribute[ATR_DEXTERITY]+5)
        {
            var _string str; str = get(self.aivar[AIV_PPNPCREMEMBERITEM]);
            var int id; id = MEM_FindParserSymbol(str.s);
        
            CreateInvItems                (self,          id, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
            B_GiveInvItems_NoAnimation (self, other, id, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
            
            var int itmPtr; itmPtr = Itm_GetPtr(id);
            var C_Item itm; itm    = MEM_PtrToInst(itmPtr);
            
            if (Hlp_IsItem (itm, ItMi_Gold))
            {
                Npc_RemoveInvItems (self, ItMi_Gold, self.aivar[AIV_PPNPCREMEMBERITEMAMOUNT]);
            };
            
            self.aivar[AIV_PlayerHasPickedMyPocket] = TRUE;
            
            B_GivePlayerXP (5);
            
            Snd_Play ("Geldbeutel");
            
            DIV_MerkeErfolgreichenTaschendiebstahl = DIV_MerkeErfolgreichenTaschendiebstahl +1;
            
        } else {
            
            AI_StopProcessInfos    (self);
            
            B_Attack (self, other, AR_Theft, 1);
        };
            
        if (DIV_MerkeErfolgreichenTaschendiebstahl >= 10)
        {
            Npc_ChangeAttribute (other, ATR_DEXTERITY, 1);
    
    
            AI_PrintS_Ext (other, "Geschicklichkeit +1", COL_Green);
            Snd_Play  ("VEL_QUEST_SUCCESS");
    
    
            DIV_MerkeErfolgreichenTaschendiebstahl = 0;
        };
        
        Info_ClearChoices (DIA_AmbientNPC_PickPocket);
        
        AI_StopProcessInfos    (self);
    };
    
    
    func void DIA_AmbientNPC_PickPocket_BACK()
    {
        Info_ClearChoices (DIA_AmbientNPC_PickPocket);
    };
    
    
    
    
    func void DIV_AmbientNPC_PickPocket(var C_NPC slf)
    {
        DIA_AmbientNPC_PickPocket_Exit.npc = Hlp_GetInstanceID(slf);
        DIA_AmbientNPC_PickPocket.npc      = Hlp_GetInstanceID(slf);
        
        var _string str; var int handle;
        
        handle = GetPickpocketHandle(slf);
        str    = get(handle);
    
    
        var int id; id = MEM_FindParserSymbol(str.s);
        
        var int itmPtr; itmPtr = Itm_GetPtr(id);
        var C_Item itm; itm    = MEM_PtrToInst(itmPtr);
        var int amount; amount = slf.aivar[AIV_PPNPCREMEMBERITEMAMOUNT];
        
        DIA_AmbientNPC_PickPocket.description = GetPickpocketDescription(itm.description, amount);
    };
    Geändert von Bloodfly91 (02.06.2019 um 16:37 Uhr)

  19. Beiträge anzeigen #19 Zitieren
    Moderator Avatar von MadFaTal
    Registriert seit
    May 2010
    Beiträge
    3.621
     
    MadFaTal ist offline
    Nur aus Interesse. Sind diese "(random > x) &&" notwendig?
    Funktioniert "if ... else if" in Gothic anders als in anderen Programmiersprachen?

  20. Beiträge anzeigen #20 Zitieren
    Ritter Avatar von Kirides
    Registriert seit
    Jul 2009
    Ort
    Norddeutschland
    Beiträge
    1.780
     
    Kirides ist offline
    Zitat Zitat von MadFaTal Beitrag anzeigen
    Nur aus Interesse. Sind diese "(random > x) &&" notwendig?
    Funktioniert "if ... else if" in Gothic anders als in anderen Programmiersprachen?
    Nicht das ich wüsste.

    kürzer und etwas schöner anzusehen:
    Code:
    if (random <= 5) {}
    else if (random <= 10) {}
    else if (random <= 15) {}
    else if (random <= 20) {}
    else if (random <= 25) {}
    else if (random <= 30) {}
    else if (random <= 35) {}
    else if (random <= 40) {}
    ...

Seite 1 von 2 12 Letzte »

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
Impressum | Link Us | intern
World of Gothic © by World of Gothic Team
Gothic, Gothic 2 & Gothic 3 are © by Piranha Bytes & Egmont Interactive & JoWooD Productions AG, all rights reserved worldwide