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

 

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

    oCNpc_PutInSlot mit Bones?

    Ich würde ganz gerne Vobs an die Knochen dranhängen, nicht nur an die Slots.
    Gibt es dafür womöglich ein einfache Möglichkeit? oCNpc_PutInSlot funktioniert nicht mit BIP01 u.ä.

    Hintergrund ist die Möglichkeit, Schutzschilde einzubauen. Aber es würde auch ermöglichen, an jedem der Slots andere Rüstung zu tragen. z.B. rechter Handschuh, linker Handschuh, unterschiedliche Schuhe etc.

    Es ist ja schließlich auch Möglich, per Animation Effekte an Knochen zu hängen.

    Code:
    	ani			("S_BSCOOL2_S2"				1	"S_BSCOOL2_S2"		0.0	0.0	M.	"Hum_BSCool_M01.asc"		F	10	50)
    			{
    				*eventSFX	(26	"Forge_Water"	EMPTY_SLOT	)
    				*eventPFX	(22	1	"WATERVAPOUR"	"BIP01 L FINGER0")
    				*eventPFXStop	(45	1)
    			}
    Da sollte so ein Vob doch sicher kein Problem sein?


    English:

    I would like to bind Vobs to bones, not just slots. Is there an easy way?
    oCNpc_PutInSlot doesn't work with BIP01 etc

    Reason is I wanna add protective Shields to the game. But it would also make it possible to wear different armor in every slot. e.g. left glove, right glove, different shoes etc.

    We know binding effects to bones is possible in animation. A vob shouldn't be a problem, right?


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

  2. Beiträge anzeigen #2 Zitieren
    Provinzheld Avatar von TopLayer
    Registriert seit
    Nov 2020
    Beiträge
    286
     
    TopLayer ist offline
    Code:
    player->CreateInvSlot("BIP01");
    oCVob* item = ogame->GetGameWorld()->CreateVob_novt(zVOB_TYPE_ITEM, "ITMW_1H_MISC_AXE");
    ogame->GetGameWorld()->AddVob(item);
    player->PutInSlot("BIP01", item, true);
    item->Release();
    Spoiler:(zum lesen bitte Text markieren)

  3. Beiträge anzeigen #3 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Is that Union Code? Because I'm sure it won't work like that in Daedalus.
    Are those functions already included in the base game? How do I use them properly?

    Your code without explanation is confusing. It would be nice if you added a few bits of information.


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

  4. Beiträge anzeigen #4 Zitieren
    Provinzheld Avatar von TopLayer
    Registriert seit
    Nov 2020
    Beiträge
    286
     
    TopLayer ist offline
    It is Union code. The only first line is important: you need to create a slot via oCNpc_CreateInvSlot in order to use it. The function is not included in the base game. You should use Ikarus or Union.

  5. Beiträge anzeigen #5 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Noch eine Ergänzung. Nur folgende Slots werden standardmäßig für NPCs erstellt ZS_RIGHTHAND, ZS_LEFTHAND, ZS_SWORD, ZS_LONGSWORD, ZS_BOW, ZS_CROSSBOW, ZS_SHIELD und ZS_HELMET. An die kannst du ohne Weiteres ein Item hängen. Andere Slots musst du, wie TopLayer beschrieben hat, erst erstellen.
    Hier ein Beispiel-Code (G1) zum Anhängen eines (im Inventar befindlichen) Items an jeglichen Slot:

    Code:
    func void NpcPutInvItemInSlot(var C_Npc slf, var int itemInst, var string slot) {
        // Create slot if it does not exist
        const int oCNpc__CreateInvSlot      = 6968448; //0x6A5480
        const int oCNpc__IsInvSlotAvailable = 6969456; //0x6A5870
        CALL_zStringPtrParam(slot);
        CALL__thiscall(_@(slf), oCNpc__IsInvSlotAvailable);
        if (!CALL_RetValAsInt()) {
            CALL_zStringPtrParam(slot);
            CALL__thiscall(_@(slf), oCNpc__CreateInvSlot);
        };
    
        // Attach inventory item if it exists (call fills item)
        if (Npc_GetInvItem(hero, itemInst)) {
            oCNpc_PutInSlot(hero, slot, _@(item), TRUE);
        };
    };

    Hier ein Beispiel dazu:
    Code:
    CreateInvItems(hero, ItMiSwordblade, 1);
    NpcPutInvItemInSlot(hero, ItMiSwordblade, "BIP01");

    PS: Die Funktion oCNpc_PutInSlot in LeGo ist nicht ganz korrekt und lässt unsinnige Daten auf dem Stack.

  6. Beiträge anzeigen #6 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Zitat Zitat von mud-freak Beitrag anzeigen
    Noch eine Ergänzung. Nur folgende Slots werden standardmäßig für NPCs erstellt ZS_RIGHTHAND, ZS_LEFTHAND, ZS_SWORD, ZS_LONGSWORD, ZS_BOW, ZS_CROSSBOW, ZS_SHIELD und ZS_HELMET. An die kannst du ohne Weiteres ein Item hängen. Andere Slots musst du, wie TopLayer beschrieben hat, erst erstellen.
    Hier ein Beispiel-Code (G1) zum Anhängen eines (im Inventar befindlichen) Items an jeglichen Slot:

    Code:
    func void NpcPutInvItemInSlot(var C_Npc slf, var int itemInst, var string slot) {
        // Create slot if it does not exist
        const int oCNpc__CreateInvSlot      = 6968448; //0x6A5480
        const int oCNpc__IsInvSlotAvailable = 6969456; //0x6A5870
        CALL_zStringPtrParam(slot);
        CALL__thiscall(_@(slf), oCNpc__IsInvSlotAvailable);
        if (!CALL_RetValAsInt()) {
            CALL_zStringPtrParam(slot);
            CALL__thiscall(_@(slf), oCNpc__CreateInvSlot);
        };
    
        // Attach inventory item if it exists (call fills item)
        if (Npc_GetInvItem(hero, itemInst)) {
            oCNpc_PutInSlot(hero, slot, _@(item), TRUE);
        };
    };

    Hier ein Beispiel dazu:
    Code:
    CreateInvItems(hero, ItMiSwordblade, 1);
    NpcPutInvItemInSlot(hero, ItMiSwordblade, "BIP01");


    PS: Die Funktion oCNpc_PutInSlot in LeGo ist nicht ganz korrekt und lässt unsinnige Daten auf dem Stack.
    Es funktioniert!

    Mann Mud-Freak, wenn ich dich und Fawkes nicht hätte, würd ich aber alt aussehen. Ihr macht so vieles möglich. Dafür erstmal ein dickes fettes DANKE


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

  7. Beiträge anzeigen #7 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Bisasam, ich fand die Idee mit den Rüstungsteilen spannend und wollte schauen, wie weit man mit dem Ansatz über "PutInSlot" kommt. Wenn man PutInSlot per Hand aufruft, kann es schnell kompliziert werden. Ich befürchte, da können dann Rüstungsteile plötzlich verschwinden oder sich verdoppeln und nicht mehr weggehen. Ebenso mit etwaigen Rüstungswerten.
    Bevor du dir jetzt die Arbeit machst und sich da nicht mehr als eine halb-funktionierende Lösung herauszuholen lässt (weil es einfach schwierig ist per Hand mit PutInSlot hinterherzukommen), habe ich mal geschaut, wie das unter der Haube aussieht (am Beispiel von Helmen).

    Dabei konnte ich ganz "einfach" die Limitierung von C_Item.wear Werten von normalen Rüstungs-Items aufheben und weitere Bones erlauben. Ich habe das Skript im Scriptbin gepostet. Ich hoffe du nimmst mir das nicht übel, da nun jeder Hinz und Kunz an dieses Feature kommt. Ich denke aber, dass spätestens nach diesem Forumthread sicher bald irgendein undurchdachtes Union-Plugin dazu auftaucht (wie unsinnig, denn so ein Feature ist nur in einer zusammenhängenden Mod mit Rüstungen sinnvoll) und es wird sich jemand ganz anderes unbeschämt dafür feiern lassen.

  8. Beiträge anzeigen #8 Zitieren
    Legende der Amazonen Avatar von Bisasam
    Registriert seit
    Dec 2006
    Ort
    Meine Faust in Sinis Gesicht
    Beiträge
    9.639
     
    Bisasam ist offline
    Ach quatsch. Ja ich reagier manchmal empfindlich auf sowas, aber konkret dieses Feature hatte ich sogar auch vor zu teilen. Meine Umsetzung wäre ziemlich umständlich über Buttons gegangen. Das hier ist viel besser.
    Es ist schon länger ein Problem, dass Neulinge keine Rüstung machen können weil diese keine Ahnung vom Riggen haben. Jetzt brauchen sie im Grunde nur noch 3ds-Dateien, die einfach angehängt werden.
    Da das Feature aber mit den meisten vorhandenen Rüstungen scheiße aussieht, muss sowieso die Mod auf das System ausgelegt werden.

    Ich würde aber gewisse Dinge als geriggtes Mesh belassen, wie z.b. Hosen, Röcke, lange Ärmel etc. und nur Dinge wie Schuhe, Handschuhe, Schulterplatten und Ärmellose Brustpanzer einfügen.
    Wobei ich mir bei Stiefeln auch nicht 100% sicher bin wie die gehören. Rollt sich der Fußballen nicht mit ab?
    Kann man da einen geriggten Stiefel für nehmen?
    Wie flexibel ist da dein System?

    PS: Danke nochmal

  9. Beiträge anzeigen #9 Zitieren
    Ehrengarde Avatar von mud-freak
    Registriert seit
    Dec 2005
    Beiträge
    2.199
     
    mud-freak ist offline
    Zitat Zitat von Bisasam Beitrag anzeigen
    Ach quatsch. Ja ich reagier manchmal empfindlich auf sowas, aber konkret dieses Feature hatte ich sogar auch vor zu teilen. Meine Umsetzung wäre ziemlich umständlich über Buttons gegangen. Das hier ist viel besser.
    Es ist schon länger ein Problem, dass Neulinge keine Rüstung machen können weil diese keine Ahnung vom Riggen haben. Jetzt brauchen sie im Grunde nur noch 3ds-Dateien, die einfach angehängt werden.
    Da das Feature aber mit den meisten vorhandenen Rüstungen scheiße aussieht, muss sowieso die Mod auf das System ausgelegt werden.

    Ich würde aber gewisse Dinge als geriggtes Mesh belassen, wie z.b. Hosen, Röcke, lange Ärmel etc. und nur Dinge wie Schuhe, Handschuhe, Schulterplatten und Ärmellose Brustpanzer einfügen.
    Wobei ich mir bei Stiefeln auch nicht 100% sicher bin wie die gehören. Rollt sich der Fußballen nicht mit ab?
    Kann man da einen geriggten Stiefel für nehmen?
    Wie flexibel ist da dein System?

    PS: Danke nochmal
    Ich habe dazu mal etwas im Scriptbin geschrieben. Die Rüstungsteile können m.W.n. nur einfaches Meshes sein. Sobald etwas über ein Gelenk (= Verbindung zweier Bones) hinweglaufen soll, müsste man daraus zwei Meshes machen und die, wie im Scriptbin erklärt im Spiel zusammenfügen.

    So etwas nur für einzelne Aspekte wie Handschuhe und Schulterplatten zu verwenden, erscheint mir am sinnvollsten. Wenn ein Rüstungsteil nicht mit einer kompletten Rüstung kompatibel sein soll, könnte man diese in der onequip-Funktion des Rüstungsteils ablegen.

  10. Beiträge anzeigen #10 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 Skript scheint in G1 nicht zu funktionieren.

    Die ersten Zeilen meiner Gothic.src:

    Code:
    _INTERN\constants.d
    _INTERN\classes.d
    
    _INTERN\MAGIC_INTERN.D
    
    STORY\Ikarus_Const_G1.d
    STORY\EngineClasses_G1\*.d
    
    STORY\Ikarus.d
    
    STORY\Float.d
    STORY\Broadcasts.d
    
    STORY\LEGO\Header.src
    STORY\LEGO\Laufzeitvob.d
    
    STORY\BunteDialoge.D
    STORY\RuestungsUpdate.D
    (Dein Skript ist in der RuestungsUpdate.d)

    Meine Startup der Testwelt (Es gibt keine INIT_GLOBAL in G1):

    Code:
    //////////////////////////////////
    
    func void Startup_GREENSCREEN()
    {
    
    };
    
    	func void INIT_SUB_GREENSCREEN ()
    	{
    		
    
    	};
    
    func void INIT_GREENSCREEN ()
    {
    
    	MEM_InitAll ();
    	
    	
    	LeGo_Init(LeGo_Gamestate|LeGo_AI_Function|LeGo_FrameFunctions|LeGo_HookEngine|LeGo_View|LeGo_Buttons|LeGo_Cursor|LeGo_Trialoge);
    	
    	HookEngine (MEMINT_SwitchG1G2 (oCInformationManager__Update_G1, oCInformationManager__Update_G2), 5, "_HOOK_INFORMATIONMANAGER_UPDATE");
        HookEngine (MEMINT_SwitchG1G2 (zCViewDialogChoice__HandleEvent_G1, zCViewDialogChoice__HandleEvent_G2), 9, "_HOOK_VIEWDIALOGCHOICE_HANDLEEVENT");
    	//MEM_Debug("STARTUP GELADEN EEEEHEEEEEHEEEE");
    	
    	ArmorParts_Init();
    	
        B_InitMonsterAttitudes ();
    	B_InitGuildAttitudes();
    	
    	
    	INIT_SUB_GREENSCREEN();
    };

    Mein Testitem:


    Code:
    instance  Neks_Amulett(C_Item)
    {
    	name 			=	NAME_Amulett;
    
    	mainflag 		=	ITEM_KAT_MAGIC;
    	flags 			=	ITEM_AMULET|ITEM_MISSION;
    
    	value 			=	50;
    
    	visual 			=	"ItMi_Amulet_01.3ds";
    
    	visual_skin 		=	0;
    	wear 			= 	WEAR_NECK;
    	material 		=	MAT_METAL;
    	on_equip		=	Equip_Schutzamulett_Nek;
    	on_unequip		=	UnEquip_Schutzamulett_Nek;
    
    	description		= name; //Nek's Amulett
    	TEXT[1]			= "Der Name NEK ist auf der Rückseite eingraviert";
    	TEXT[2]			= NAME_Prot_Edge;
    	COUNT[2]		= 5;
    	//TEXT[3] 		= "";
    	////COUNT[3]		= ;
    	TEXT[5]			= NAME_Value;
    	COUNT[5]		= value;
    };
    
    	FUNC VOID Equip_Schutzamulett_Nek()
    	{
    		ALNeksAmulett=1;
    		self.protection [PROT_EDGE] += 5;
    		self.protection [PROT_BLUNT] += 5;
    	};
    
    
    	FUNC VOID UnEquip_Schutzamulett_Nek()
    	{
    		ALNeksAmulett=0;
    		self.protection [PROT_EDGE] -= 5;
    		self.protection [PROT_BLUNT] -= 5;
    	};

    Was passiert:

    Ich leg das Amulett an und sehs nicht.
    Keine Fehlermeldungen. Es scheint nur nicht zu klappen

    edit: Es liegt doch glatt am Mainflag. Das Teil muss Mainflag item_kat_armor haben, sonst gehts nicht.
    Wobei ich dazu sagen muss, dass die Amulette in ihrer Grundform nicht zum direkten Anlegen geeignet sind. Sie sind gerade so groß, dass sie innerhalb des Halses verschwinden und die Ausrichtung ist um 90 Grad verdreht. Außerdem müsste das Amulett selbst in die entgegengesetzte Richtung gucken.


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

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