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 2 von 4 « Erste 1234 Letzte »
Ergebnis 21 bis 40 von 77
  1. Beiträge anzeigen #21 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
     
    mainclain ist offline
    Zitat Zitat von Bisasam Beitrag anzeigen
    3 Jahre später bin ich immer noch nicht weiter gekommen. OpenInventory bringt keine Transaktionsmöglichkeiten. B_GiveTradeInv erschafft bloß Items im Inventar eines Npcs aber hat nirgends eine Funktion die das Interface aufruft. Gleiches gilt beim Dead-Zustand, der zwar ein Inventar gibt, aber keine Interface-Öffnung anzeigt.
    Die G1-Skripte sind nicht aufschlussreicher.

    Jemand anderes hat es wohl über den Dead-Zustand geregelt. Orkherrschaft oder so.

    Hm dann häng ich das wohl an den Nagel.
    Wie ich geschrieben hatte, nutze
    public: int __thiscall oCNpc::OpenSteal(void) 0x00762430

    wobei der npc immer der Spieler ist.
    Die funktion rufst du beim tastendruck auf. Eventuell musst du dazu noch überprüfen, ob der Spieler schleicht und ein npc im Fokus hat.

  2. Beiträge anzeigen #22 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Bei Open Steal geht das Inventar sofort zu wenn man versucht ein Item zu nehmen. Das Item bleibt natürlich beim Npc. Es ist als würde man rechtsklick machen um es zu schließen.
    Sieht nach kaputtem Code-Relikt aus


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  3. Beiträge anzeigen #23 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
     
    mainclain ist offline
    Dann klappt doch alles.
    Das bedeutet nur, das der Taschendiebstahl nicht erfolgreich war, wahrscheinlich, weil du den Skill-Value nicht auf 100% gesetzt hast - oder während dessen von jemanden gesehen wurdest.
    Npc_SetTalentValue(self, 6, 100) -> 100% chance, dass du ein Item klauen kannst.


    Außerdem kann auch noch die Funktion G_CANSTEAL definiert werden. Die wird allerdings direkt bei OpenSteal aufgerufen und kann so komplett verhindern, dass man bestimmte NPCs beklauen kann.

    Hier mal wie sie in G1 aussieht (kA ob in G2 vorhanden - edit: okay ist vorhanden und gibt immer True aus - das ist fürs erste auch okay).
    Code:
    func int G_CanSteal()
    {
        if    ( ( other.npcType != NPCTYPE_FRIEND ) && ( other.npcType != NPCTYPE_MAIN ) )
        {
            return TRUE;
        }
        else
        {
            PrintScreen    (_STR_MESSAGE_CANNOTSTEAL, -1, _YPOS_MESSAGE_CANNOTSTEAL, _STR_FONT_ONSCREEN, _TIME_MESSAGE_CANNOTSTEAL );        
            
            return FALSE;
        };
    };

    Beim Fehlschlag wird außerdem die Perception auf PERC_CATCHTHIEF gestellt. Auch da bin ich mir gerade nicht sicher, ob es die nötigen ZS in G2 gibt, oder ob man sie selbst hinzufügen muss (Edit: hab auch da nachgeguckt, da müsstest du per Npc_PercEnable die Funktion selbst für hinzufügen, damit NPCs auf ein Fehlschlag reagieren).
    Geändert von mainclain (02.09.2015 um 21:03 Uhr)

  4. Beiträge anzeigen #24 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Hätte nicht gedacht dass der bei meinem Call tatsächlich noch auf das Talent zugreift. Danke.

    Perc_CatchThief ruft automatisch B_AssessTheft auf wodurch die Reaktion vom vorhandenen Rechtssystem übernommen wird.
    Das Problem ist aktuell dass das Spiel bei

    Code:
    if (!C_IsTakenItemMyPossession (self, other, item))
    	{
    		return;
    	};
    aus der Funktion rausspringt. Genauso bei

    Code:
    if (!Npc_CanSeeNpc (self, other))
    	{
    		if (Npc_IsInPlayersRoom (self))
    		&& ( (Npc_IsInState(self, ZS_ObservePlayer)) || (Npc_IsInState(self, ZS_ClearRoom)) )
    		{
    			//trotzdem gesehen!
    		}
    		else
    		{
    			return;
    		};
    	};
    Ich brauche im Grunde so eine Art Abfrage die mir sagt ob das Steal Invi noch geöffnet ist. Dann könnte ich mit einer Variable arbeiten die auch dort greift und bei Diebstahl eingreift mit entsprechender Reaktion.
    Damit würde das ganze auch schon perfekt funktionieren. Das mit dem offenen Invi bereitet mir dabei gerade Schwierigkeiten. Ne Idee?


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  5. Beiträge anzeigen #25 Zitieren
    Held Avatar von mainclain
    Registriert seit
    Sep 2005
    Beiträge
    5.426
     
    mainclain ist offline
    Wenn du es wirklich brauchst:
    ; public: static int oCNpc::game_mode 0x00AB27D0
    An der speicher-position steht ein integer. Wenn du den auslesen kannst:
    Normal: 0
    Plündern: 1
    Stehlen: 2

    Denke das sollte also so funktionieren:
    MEM_ReadInt(11216848) == 2

  6. Beiträge anzeigen #26 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Fantastisch danke. Ich teste das bei mir und wenn alles klappt lade ich eine komplette anleitung in die modderdatenbank


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  7. Beiträge anzeigen #27 Zitieren
    Hero Avatar von lali
    Registriert seit
    Feb 2016
    Beiträge
    5.473
     
    lali ist offline
    Hey Bisasam. Was ist denn daraus geworden? So ne Anleitung wär klasse.
    Phoenix Dev | Website | Discord

  8. Beiträge anzeigen #28 Zitieren
    Provinzheld
    Registriert seit
    Dec 2013
    Ort
    Berlin
    Beiträge
    232
     
    MyGamingHD ist offline
    Ich fände auch interessant was draus geworden ist.



  9. Beiträge anzeigen #29 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Weil ich gestern noch dran gearbeitet habe, gibts jetzt hier die Anleitung.

    Dieses Skript:

    Code:
    const int InventoryState =11216848;
    const int PickpocketInv = 2;
    const int OpenPickpocket =  7742512;
    
    func void Taschendiebstahl()
    {
    	
    	Npc_GetTarget (hero);
    	
    	diebstahlsopfer=Hlp_GetNpc (other);
    	
    	if MEM_ReadInt(InventoryState) == PickpocketInv
    	{
    			imtaschendiebstahl=1;
    			//print ("klaue");
    	}else
    	{
    			imtaschendiebstahl=0;
    			//print ("klaue nicht");
    	};	
    	
    	
    	if Npc_GetWalkMode (hero) == NPC_SNEAK
    	&& !Npc_CanSeeNpc (diebstahlsopfer,hero)
    	&& BelegteTaste ("keyAction",KEY_NUMPAD1)==TRUE
    	&& imtaschendiebstahl==0
    	{
    	
    
    		const int call = 0;
     		if (CALL_Begin( call)) 
     		{
    		var int herPtr; herPtr = _@(hero);
    		CALL__thiscall (_@(herPtr),OpenPickpocket);
    		call = CALL_End();
    		};
    	};	
    
    };
    mit diesen Definitionen in den Story_Globals:

    Code:
    var C_NPC Diebstahlsopfer;
    var int imtaschendiebstahl;
    und nicht zu vergessen diese Funktion, die ich zur Vereinfachung geschrieben habe:

    Code:
    func int BelegteTaste(var string AniTaste, var int AlternativTaste)
    {
    	if Hlp_StrCmp (MEM_GetGothOpt ("KEYS",AniTaste),"")==TRUE
    	&& MEM_KeyPressed (AlternativTaste)
    	{
    		//print ("Standardbelegung");
    		return TRUE;	
    	};	
    	if MEM_KeyPressed (MEM_GetKey (AniTaste))
    	|| MEM_KeyPressed (MEM_GetSecondaryKey (AniTaste))
    	{
    		//print ("Alternativbelegung");
    		return TRUE;	
    	};	
    	return FALSE;
    };
    (In dieser Funktion wird bei einer nicht definierten Taste eine Alternativtaste angegeben. Beispiel: Die Taste für SPRINGEN ist nicht definiert. Ist das der Fall, schnappt sich die Funktion jene Taste, die ihr als Alternative angegeben habt, z.B. KEY_NUMPAD1. Ist die Taste definiert, wird die Definition genommen.)

    Zuerst wird abgefragt, ob das Diebstahlsinventar offen ist und je nachdem die Variable gesetzt. Die wird später noch in Zustandsskripten für Reaktionen verwendet.

    Weiter unten soll das Inventar nur dann geöffnet werden, wenn es noch nicht offen ist. Die calls rufen die Enginefunktion auf, die ansonsten noch vollkommen funktionsfähig sind.

    Das Problem liegt in den Diebstahlsreaktionen von Npcs. Alle umherstehenden gehen nämlich davon aus, dass ihnen selbst das Item gehörte. Das ist auch dann der Fall, wenn der beklaute Npc den Täter nicht ertappt hat.

    Wir müssen also in die B_Assesstheft und ein paar Ergänzungen vornehmen.
    Ich poste der Einfachheit halber meine komplette Assesstheft.

    Code:
    func void B_AssessTheft ()
    {
    	// EXIT IF...
    	// ------ other ist NICHT der Spieler ------
    	if (!Npc_IsPlayer (other)) 
    	{
    		return;
    	};
    	
    
    	// ------- Player im Haus und NSC in anderem Stockwerk ------
    	if (Wld_GetPlayerPortalGuild() >= GIL_NONE) //also NICHT Draussen (== -1)
    	&& (Npc_GetHeightToNpc(self, other) > PERC_DIST_INDOOR_HEIGHT)
    	{
    		return;
    	};
    	
    	// ------ ignorieren, wenn NSC-Gilde freundlich zu Taeter-Gilde ------
    	if (Wld_GetGuildAttitude(self.guild,other.guild) == ATT_FRIENDLY)
    	{
    		if (Hlp_IsValidItem(item)) 
    		&& (Npc_OwnedByNpc(item, self))
    		{
    			//weiter (kein Abbruch bei persönlichem Besitz)
    		}
    		else
    		{
    			return;
    		};		
    	};
    
    	// ------ Item gehörte mir nicht ------
    
    //////////////AKTUALISIERT/////////////////////////////////
    	if (!C_IsTakenItemMyPossession (self, other, item))
    	&& imtaschendiebstahl==0
    	{
    		return;
    	};
    	
    	// ------ NSC kann Taeter NICHT sehen ------
    	if (!Npc_CanSeeNpc (self, other))
    	&& imtaschendiebstahl==0
    	{
    		if (Npc_IsInPlayersRoom (self))
    		&& ( (Npc_IsInState(self, ZS_ObservePlayer)) || (Npc_IsInState(self, ZS_ClearRoom)) )
    		{
    			//trotzdem gesehen!
    		}
    		else
    		{
    			return;
    		};
    	}else if imtaschendiebstahl==1
    	&& !Npc_CanSeeNpc (self,other)
    	{
    		
    	};
    
    //////////ENDE AKTUALISIERUNG///////////////////	
    	// ------ ignore THEFT ------
    	if (!C_WantToAttackThief(self, other))
    	{
    		// ------ Torwachen greifen nicht an, memorizen aber News ------
    		if (C_NpcIsGateGuard(self))
    		{
    			B_MemorizePlayerCrime (self, other, CRIME_THEFT);
    		};
    
    /////////////AKTUALISIERUNG FÜR FREUNDE (NICHT ZWINGEND NOTWENDIG)////////////
    
    		if (self.npctype == NPCTYPE_FRIEND 
    		||	self.aivar[AIV_IGNORE_Theft] == TRUE)
    		&& self.aivar[AIV_HeroTaschendieb]==0
    		{	
    			AI_StandUpQuick (self);
    			B_TurnToNpc (self,other);
    			B_Say (self,other,"$HANDSOFF");
    			self.aivar[AIV_HeroTaschendieb]+=1;
    		}else if (self.npctype == NPCTYPE_FRIEND 
    		||	self.aivar[AIV_IGNORE_Theft] == TRUE)
    		&& self.aivar[AIV_HeroTaschendieb]==1
    		{		
    		AI_StandUpQuick (self);
    		B_TurnToNpc (self,other);
    		B_Say (self,other,"$WHATAREYOUDOING");
    		self.aivar[AIV_HeroTaschendieb]+=1;
    		}else if (self.npctype == NPCTYPE_FRIEND 
    		||	self.aivar[AIV_IGNORE_Theft] == TRUE)
    		&& self.aivar[AIV_HeroTaschendieb]==2
    		{
    			B_Attack (self, other, AR_ReactToDamage, 0);
    			return;
    		};
    
    
    ////////////ENDE AKTUALISIERUNG FÜR FREUNDE/////////////////		
    		return;
    	};
    
    ///////////NEUER ABSCHNITT FÜR TASCHENDIEBSTAHL///////////		
    	// FUNC
    	if imtaschendiebstahl==1
    	&& Hlp_GetInstanceID (self)==Hlp_GetInstanceID (diebstahlsopfer)
    	{	
    		B_Attack (self, other, AR_Theft, 0);						//angreifen oder fliehen
    	}else if imtaschendiebstahl==1
    	&& Hlp_GetInstanceID (self)!=Hlp_GetInstanceID (diebstahlsopfer)
    	{
    		B_Attack (self, other, AR_GuardCalledToThief, 0);	
    	}else if imtaschendiebstahl==0
    	{
    		B_Attack (self, other, AR_Theft, 0);	
    	};	
    	return;
    ///////////ENDE NEUER ABSCHNITT/////////////////////////////////////
    };
    AIV_HeroTaschendieb speichert, wie oft der Held diesen Npc beklaut hat. Ich habe das eingebaut, damit Freunde ihm das zwei Mal durchgehen lassen bevor sie angreifen.
    Ihr könnt diesen Teil aber auch ersatzlos streichen, er ist nicht für den Taschendiebstahl erforderlich.

    Das müsste es theoretisch sogar schon gewesen sein. Ich hoffe ich habe nichts vergessen.
    Habe zwar gestern erst ein paar Dinge getestet, aber einige Abschnitte habe ich vor Jahren geschrieben und da kann man schonmal was vergessen.


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette
    Geändert von Bisasam (04.05.2017 um 13:30 Uhr)

  10. Beiträge anzeigen #30 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Sehr gute Arbeit. Könntest du in der B_AssessTheft() vielleicht noch hervorheben, was genau deine Änderungen sind? Das macht es sicherlich einfacher, das zu übertragen.

    Außerdem fehlt noch die Funktion BelegteTaste(), die ist ziemlich sicher nicht bei Ikarus dabei, auch wenn ich mir ungefähr denken kann, was sie tun soll.
    Und ein letzter klitzekleiner Schönheitsfehler: In der Funktion Taschendiebstahl() sind zwei "Magic Numbers", d.h. irgendwelche Zahlen, die keinen sinnvollen Namen haben (und daher nicht nachvollziehbar ist, wie man diese Zahlen ausgewählt hat). Ich weiß nicht, ob du dich noch erinnerst, was für Adressen das waren, aber es wäre schön, wenn du denen per Konstanten einen Namen geben könntest In zwei Jahren freut man sich dann, wenn man nochmal über das Script stolpert und was verändern möchte.

  11. Beiträge anzeigen #31 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Die belegtetaste habe ich 1 min vor deinem Post editiert


    Code:
    MEM_ReadInt(11216848) == 2
    Fragt ab ob das Diebstahlsinventar offen ist. Anscheinend gibt es da verschiedene Inventarzustände von 0 bis X. 0 ist geschlossen (glaube ich), 1 ist (glaube ich) das normale vom Spieler, 2 ist Diebstahl, 3 ist (GLAUBE ICH) Handel. Sicher bin ich mir nur noch bei 2. Alles andere müsste man testen.

    Code:
    CALL__thiscall (_@(herPtr),7742512);
    Öffnet das Diebstahlsinventar. Ich weiß aber nicht ob da noch mehr hintersteckt und inwieweit da eine Kettenreaktion mit weiteren Enginefunktionen stattfindet.


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  12. Beiträge anzeigen #32 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    Npc_GetWalkMode ist bei mir undefiniert wenn ich es so starten will

    und habe ich das richtig verstanden das alles in die Story_Globals kommt (ausser die B_AssessTheft) ?
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-
    Geändert von aebo (04.05.2017 um 12:43 Uhr)

  13. Beiträge anzeigen #33 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  14. Beiträge anzeigen #34 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Habe die MagicNumbers ausgetauscht. Ich weiß aber nicht wie ich in Code-Tags etwas hervorheben kann. Habe mal was von Farbeimer gehört, aber keine Ahnung wie ich das einsetzen kann.


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  15. Beiträge anzeigen #35 Zitieren
    Ritter Avatar von aebo
    Registriert seit
    Oct 2008
    Beiträge
    1.278
     
    aebo ist offline
    welche voraussetzungen müssen denn beim npc der bestohlen werden soll erfüllt sein? das g2 script für den taschendiebstahl?
    Das Wappen
    -Eine fantastische Spielwelt erwartet dich-
    -bis zu 100 Stunden Spielzeit-

  16. Beiträge anzeigen #36 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Schönes Skript und cool, dass du es teilst.

    Je nachdem wann die Funktion Taschendiebstahl() aufgerufen wird, könnte es nicht schaden noch abzufragen, ob other belegt (und menschlich) ist. Ich denke, dass du das sicher an anderer Stelle schon gemacht hast.
    Code:
    func void Taschendiebstahl()
    {
    	
        Npc_GetTarget(hero);
    
        diebstahlsopfer=Hlp_GetNpc(other);
    
        if (!Hlp_IsValidNpc(diebstahlsopfer)) {
            return;
        };
    
        if (diebstahlsopfer.guild > GIL_SEPERATOR_HUM) {
            return;
        };
    
        //...

    Farbeimer funktioniert ganz einfach. Ich hatte früher die FarbeimerMini.exe auf einen Shortcut gelegt, das ging dann mit einem Tastendruck. Bei Skripten, die Ikarus benutzen kommt es zu Fehlern wenn man von _^ und _@ Gebrauch macht. Wenn man nicht auf Farbe verzichten will kann man die beiden Funktionskürzel vor dem Färben mit Suchen&Ersetzen ändern und anschliessend wieder zurückändern - etwas mühlselig.

  17. Beiträge anzeigen #37 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Ich habe noch nie versucht ein Tier zu beklauen. Gut, dass du mich daran erinnerst.

    Allerdings gibt es abseits dieser Sache noch ein Problem: Personen die im BS_SIT sind oder im BS_MOBINTERACT können nicht beklaut werden. Und ich habe keine Ahnung wo das definiert ist.
    Scheint eine interne Enginesache zu sein.


    "Das erinnert doch sehr erfreulich an das, was man sich als Gothicfan wünscht!"
    -Korallenkette

  18. Beiträge anzeigen #38 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Bisasam Beitrag anzeigen
    Personen die im BS_SIT sind oder im BS_MOBINTERACT können nicht beklaut werden. Und ich habe keine Ahnung wo das definiert ist.
    Scheint eine interne Enginesache zu sein.
    Funktioniert da nicht C_BodyStateContains(self, bodystate)?

  19. Homepage besuchen Beiträge anzeigen #39 Zitieren
    Clockwork Origins Avatar von Bonne6
    Registriert seit
    Jun 2004
    Ort
    Erlangen
    Beiträge
    11.826
     
    Bonne6 ist offline
    Coole Sache, Bisasam

  20. Beiträge anzeigen #40 Zitieren
    Dea
    Registriert seit
    Jul 2007
    Beiträge
    10.447
     
    Lehona ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Funktioniert da nicht C_BodyStateContains(self, bodystate)?
    Bringt ja nix, wenn man feststellen kann, dass der NPC gerade sitzt, wenn dann das Diebstahlinventar trotzdem nicht aufgeht

    Zitat Zitat von Bisasam Beitrag anzeigen
    Habe die MagicNumbers ausgetauscht. Ich weiß aber nicht wie ich in Code-Tags etwas hervorheben kann. Habe mal was von Farbeimer gehört, aber keine Ahnung wie ich das einsetzen kann.
    Sehr gut. Für Farbeimer legst du einfach deinen Code in die Zwischenablage (Strg+C), startest die FarbeimerMini.exe und kannst dann deinen Code hier in den Forenpost kopieren (Farbeimer hat die Zwischenabläge mittels BB-Tags eingefärbt).
    Allerdings solltest du in Code-Tags genauso Text einfärben können wie in anderen Teilen deines Posts auch (das A in der ersten Zeile im Editor anklicken, direkt neben dem Smiley).

Seite 2 von 4 « Erste 1234 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