-
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)
-
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();
-
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
-
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.
-
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.
-
Zitat von mud-freak
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
-
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.
-
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
-
Zitat von Bisasam
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.
-
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
|