Gothic 2 Skrypt Dwóch mieczy 1142 8

O temacie

Autor Siemekk

Zaczęty 11.10.2016 roku

Wyświetleń 1142

Odpowiedzi 8

Siemekk

Siemekk

Złote Wrota
Szlachcic
posty1493
Propsy370
ProfesjaSkrypter
  • Złote Wrota
  • Szlachcic

Siemekk
Złote Wrota

Gothic 2 Skrypt Dwóch mieczy
2016-10-11, 22:08(Ostatnia zmiana: 2016-10-11, 22:18)
Wiele modderów chciało by mieć duale, a raczej było tak x lat temu. Niegdyś @Avallach opisał jak zrobić duale na zasadzie Kusza i Miecz. Napisał także, że jest możliwe by zrobić tak, aby każdy miecz jednoręczny był Dualem... O dziwo nie było to takie trudne :O Sam skrypt zawiera mniej niż 200 linijek kodu. Oraz ma na chwilę obecną małą ilość błędów. (Miecz wypada po pobiciu, chowa się gdy używamy mapy [dzięki skryptowi orka ;) ], jedyne czego jeszcze nie ma to coś z pływaniem, lecz to zaktualizuje.)
WYMAGANY IKARUS oraz LEGO !!!

Kod:
func int oCNPC_GetSlotItem (var C_NPC slf, var string slotName)
{
    CALL_zStringPtrParam (slotName);
    CALL__thiscall (MEM_InstToPtr (slf), 7544560);
    return CALL_RetValAsPtr ();
};

func int Extract_CharToHex(var string c)
{
if(hlp_strcmp(c,"f")){ return 15; }
else if(hlp_strcmp(c,"e")){ return 14; }
else if(hlp_strcmp(c,"d")){ return 13; }
else if(hlp_strcmp(c,"c")){ return 12; }
else if(hlp_strcmp(c,"b")){ return 11; }
else if(hlp_strcmp(c,"a")){ return 10; }
else if(hlp_strcmp(c,"9")){ return 9; }
else if(hlp_strcmp(c,"8")){ return 8; }
else if(hlp_strcmp(c,"7")){ return 7; }
else if(hlp_strcmp(c,"6")){ return 6; }
else if(hlp_strcmp(c,"5")){ return 5; }
else if(hlp_strcmp(c,"4")){ return 4; }
else if(hlp_strcmp(c,"3")){ return 3; }
else if(hlp_strcmp(c,"2")){ return 2; }
else if(hlp_strcmp(c,"1")){ return 1; }
else   { return 0; };
};

const int    AIV_Dual    = 97;             
const int    AIV_Dual_Equipped    = 98;             

const string DUAL_SlotEquip = "ZS_LONGSWORD";
const string DUAL_SlotDrawn = "ZS_LEFTHAND";
const int    DUAL_Slot      = 4;           

var int Dual_Instance;
func void _Dual_Equip()
{
 
var c_item itm; itm = _^(MEM_ReadInt(ESP+324+4));
var c_item Save_Item;
if(MEM_KEYSTATE(KEY_2)==KEY_PRESSED)
{
if((itm.flags & ITEM_SWD) || (itm.flags & ITEM_AXE)) 
{
if(!Npc_HasEquippedMeleeWeapon(hero)){return;};

var c_item eq; eq = Npc_GetEquippedMeleeWeapon(hero);
if(eq.flags & ITEM_2HD_SWD)||(eq.flags & ITEM_2HD_AXE){return;};
if(!oCNPC_GetSlotItem(hero,"ZS_LONGSWORD"))&&(!hero.aivar[AIV_Dual])
{
if(itm.flags & ITEM_ACTIVE){return;};
hero.slot = itm.visual;
itm.flags = itm.flags | ITEM_ACTIVE;
Dual_Instance= MEM_InstToPtr(itm);
var int vobPtr; vobPtr = MEM_InsertVob(hero.slot, MEM_GetAnyWP());
hero.aivar[AIV_Dual] = oCNpc_PutInSlot(hero, DUAL_SlotEquip, vobPtr, DUAL_Slot);
Mdl_ApplyOverlayMDS(hero,"humans_1hst1");
hero.aivar[AIV_Dual_Equipped] = TRUE;
}
else
{
var c_item dual; dual = MEM_PtrToInst(Dual_Instance);
dual.flags = itm.flags & ~ ITEM_ACTIVE;
oCNpc_RemoveFromSlot(hero, DUAL_SlotEquip, hero.aivar[AIV_Dual], DUAL_Slot);
hero.aivar[AIV_Dual] = 0;
Mdl_RemoveOverlayMDS(hero,"humans_1hst1");
Dual_Instance = 0;
hero.aivar[AIV_Dual_Equipped] = FALSE;
};
};
};
};

func void _Dual_Draw()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
if(!(Npc_IsPlayer(slf)))||(!hero.aivar[AIV_Dual]){return;};

if(oCNPC_GetSlotItem(hero,"ZS_RIGHTHAND"))&&(!oCNPC_GetSlotItem(hero,"ZS_LEFTHAND"))
{
oCNpc_RemoveFromSlot(hero, DUAL_SlotEquip, hero.aivar[AIV_Dual], DUAL_Slot);
var int vobPtr;    vobPtr = MEM_InsertVob(hero.slot, MEM_GetAnyWP());
hero.aivar[AIV_Dual] = oCNpc_PutInSlot(hero, DUAL_SlotDrawn, vobPtr, DUAL_Slot);
};
 };



func void _Dual_UnDraw()
{
var c_npc slf; slf = MEM_PtrToInst(ECX);
      if(!(Npc_IsPlayer(slf)))||(!hero.aivar[AIV_Dual]){return;};
  if(oCNPC_GetSlotItem(hero,"ZS_SWORD"))&&(!oCNPC_GetSlotItem(hero,"ZS_LONGSWORD"))
  {
oCNpc_RemoveFromSlot(hero, DUAL_SlotDrawn, hero.aivar[AIV_Dual], DUAL_Slot);
var int vobPtr;    vobPtr = MEM_InsertVob(hero.slot, MEM_GetAnyWP());
hero.aivar[AIV_Dual] = oCNpc_PutInSlot(hero, DUAL_SlotEquip, vobPtr, DUAL_Slot);
};
};


func void _Dual_UnEquip_Hook()
{
if(!ECX||!ESP) { return; };

var c_npc slf; slf = MEM_PtrToInst(ECX);
var int DualPtr; DualPtr = MEM_ReadInt(ESP+4);
var c_item Ldual; Ldual = MEM_PtrToInst(Dual_Instance);
    if(!DualPtr) { return; };
    var c_item dual; dual = MEM_PtrToInst(DualPtr);


if(!Npc_IsPlayer(slf)){return;}; if(!hero.aivar[AIV_Dual]){return;}; if(dual.mainflag == ITEM_KAT_ARMOR){return;};
if(oCNPC_GetSlotItem(hero,"ZS_LONGSWORD"))
{
Ldual.flags = Ldual.flags & ~ ITEM_ACTIVE;
oCNpc_RemoveFromSlot(hero, DUAL_SlotEquip, hero.aivar[AIV_Dual], DUAL_Slot);
hero.aivar[AIV_Dual] = 0;
Mdl_RemoveOverlayMDS(hero,"humans_1hst1");
hero.aivar[AIV_Dual_Equipped] = FALSE;
};
};

func void _Dual_Drop()
{
if(!ECX) { return; };
var c_npc slf; slf = MEM_PtrToInst(ECX);
if(!Npc_IsPlayer(slf)){return;};

if(!hero.aivar[AIV_Dual])||(!Dual_Instance){return;};
if(Npc_IsInFightMode(hero, FMode_None)) { return; };

var c_item dual; dual = MEM_PtrToInst(Dual_Instance);
var zCVob npc; npc = MEM_PtrToInst(ECX);
    MEM_InsertItem(dual,npc.trafoObjToWorld[3], npc.trafoObjToWorld[7], npc.trafoObjToWorld[11]);
        Npc_RemoveInvItem(slf, Hlp_GetInstanceID(dual));

if(oCNPC_GetSlotItem(hero,"ZS_LONGSWORD"))
{
oCNpc_RemoveFromSlot(hero, DUAL_SlotEquip, hero.aivar[AIV_Dual], DUAL_Slot);
}
else if(oCNPC_GetSlotItem(hero,"ZS_LEFTHAND"))
{
oCNpc_RemoveFromSlot(hero, "ZS_LEFTHAND", hero.aivar[AIV_Dual], DUAL_Slot);
};
dual.flags = dual.flags & ~ ITEM_ACTIVE;
hero.aivar[AIV_Dual] = 0;
Mdl_RemoveOverlayMDS(hero,"humans_1hst1");
Dual_Instance = 0;
hero.aivar[AIV_Dual_Equipped] = FALSE;
};
func void _Duals_Debug_Map()
{
var int map_key;
var string onekey;
var string keystr;

keystr = MEM_GetGothOpt ("KEYS","keyShowMap");
onekey = Str_Prefix(keystr,4);
map_key = 16*Extract_CharToHex(str_prefix(onekey,1));
map_key += Extract_CharToHex(str_substr(onekey,1,1));

if(MEM_KeyState(map_key)==KEY_PRESSED)
{
if(!hero.aivar[AIV_Dual_Equipped]){return;}; if(!C_BodyStateContains(hero,BS_STAND)){return;};
oCNpc_RemoveFromSlot(hero, DUAL_SlotDrawn, hero.aivar[AIV_Dual], DUAL_Slot);
var int vobPtr;    vobPtr = MEM_InsertVob(hero.slot, MEM_GetAnyWP());
hero.aivar[AIV_Dual] = oCNpc_PutInSlot(hero, DUAL_SlotEquip, vobPtr, DUAL_Slot);
};
};
func void Duals_ReInit()
{
if(!hero.aivar[AIV_Dual_Equipped]){return;};
var c_item dual; dual = MEM_PtrToInst(Dual_Instance);
hero.slot = dual.visual;
var int vobPtr;   vobPtr = MEM_InsertVob(hero.slot, MEM_GetAnyWP());
if(Npc_IsInFightMode(hero,FMode_None))
{
hero.aivar[AIV_Dual] = oCNpc_PutInSlot(hero, DUAL_SlotEquip, vobPtr, DUAL_Slot);
}
else
{
hero.aivar[AIV_Dual] = oCNpc_PutInSlot(hero, DUAL_SlotDrawn, vobPtr, DUAL_Slot);
};
dual.flags = dual.flags | ITEM_ACTIVE; //tu chyba coś się buguje :I

};



func void Duals_Init()
{
   const int done = 0;
   if(!done)
   {
    HookEngineF(oCNpc__EV_DrawWeapon,    6, _Dual_Draw);
     HookEngineF(oCNpc__EV_DrawWeapon1,    5, _Dual_Draw);
    HookEngineF(oCNpc__EV_DrawWeapon2,    6, _Dual_Draw);
    HookEngineF(oCNpc__EV_RemoveWeapon,  7, _Dual_UnDraw);
    HookEngineF(oCNpc__EV_RemoveWeapon1, 7, _Dual_UnDraw);
    HookEngineF(oCNpc__UnequipItem,      6, _Dual_UnEquip_Hook);
    HookEngineF(oCNpc__DropUnconscious, 7, _Dual_Drop);
    HookEngineF(7369071,        6, _Dual_Equip);
done = 1;
    };
FF_ApplyOnce(_Duals_Debug_Map); //Map debbug
};

Inicjujemy w Startup po Ikarusie i LeGo.
LeGo_Init(LeGo_ALL);
Duals_Init();
Duals_ReInit();

I to chyba wszystko. Jeżeli chcecie użyć tego w modyfikacji nakazało by podać autora...
Animacje we własnym zakresie... Mam z DarkSagi, lecz raczej nie mogę ich udostępnić...
Screen z gry  :lol2:
Spoiler


Npc jeszcze nie obsługują tego, lecz to tylko kwestia czasu gdy będą :)
 
Nie mam nic przeciwko jeśli poprosisz o pomoc...
Tylko jak już prosisz to nie proś o podstawy lub Ikarusa & LeGo gdy nie znasz nawet podstaw.
Moje skrypty:
Dwa ostrza |Unbalance 1.2

Pan.L

Pan.L

Użytkownicy
posty62
Propsy2
Profesjabrak
  • Użytkownicy
Dobra robota leci props :) Czekam na więcej skryptów. Osobiście uważam że powinno powstawać więcej poradników tego typu aby pewne osiągnięcia w dziedzinach animacji,skryptów stawały się standardem który podniesie jak mniemam jakość wszystkich modów. Sam po cichu liczę że powstanie podobny poradnik do kołczanów które próbuje od jakiegoś czasu rozkminić :D
 

Halicor

Halicor

Użytkownicy
posty200
Propsy23
ProfesjaNierób
  • Użytkownicy
  • online
Mały edit Pan.L to nie jest poradnik tylko gotowiec :D
 

Toworish

Toworish

Użytkownicy
http://chomikuj.pl/ToWoRiSh
posty1515
Propsy210
ProfesjaNierób
  • Użytkownicy
  • http://chomikuj.pl/ToWoRiSh
Co do wypadania miecza, o ile dobrze pamiętam podobny miałem problem, http://themodders.org/index.php?topic=25315.0

Patrz @Siemekk tutaj w moim starym poradniku jest  kawałek skryptu od Splash'a który to usuwa miecz ze slotu w odpowiednim momencie
 
Siedzę tutaj x lat. Cego się nauczyłem? niczego, Jestem pierdolonym leniem :)

Siemekk

Siemekk

Złote Wrota
Szlachcic
posty1493
Propsy370
ProfesjaSkrypter
  • Złote Wrota
  • Szlachcic
Miecz wypada normalnie :P Dzięki tej funkcji:
func void _Dual_Drop()
{
if(!ECX) { return; };
var c_npc slf; slf = MEM_PtrToInst(ECX);
if(!Npc_IsPlayer(slf)){return;};

if(!hero.aivar[AIV_Dual])||(!Dual_Instance){return;};
if(Npc_IsInFightMode(hero, FMode_None)) { return; };

var c_item dual; dual = MEM_PtrToInst(Dual_Instance);
var zCVob npc; npc = MEM_PtrToInst(ECX);
    MEM_InsertItem(dual,npc.trafoObjToWorld[3], npc.trafoObjToWorld[7], npc.trafoObjToWorld[11]);
        Npc_RemoveInvItem(slf, Hlp_GetInstanceID(dual));

if(oCNPC_GetSlotItem(hero,"ZS_LONGSWORD"))
{
oCNpc_RemoveFromSlot(hero, DUAL_SlotEquip, hero.aivar[AIV_Dual], DUAL_Slot);
}
else if(oCNPC_GetSlotItem(hero,"ZS_LEFTHAND"))
{
oCNpc_RemoveFromSlot(hero, "ZS_LEFTHAND", hero.aivar[AIV_Dual], DUAL_Slot);
};
dual.flags = dual.flags & ~ ITEM_ACTIVE;
hero.aivar[AIV_Dual] = 0;
Mdl_RemoveOverlayMDS(hero,"humans_1hst1");
Dual_Instance = 0;
hero.aivar[AIV_Dual_Equipped] = FALSE;
};
Brakuje tylko dodawania DMG do puli, mogę to zrobić, ale nie chce mi się teraz, oraz nie mam też tyle czasu...
 
Nie mam nic przeciwko jeśli poprosisz o pomoc...
Tylko jak już prosisz to nie proś o podstawy lub Ikarusa & LeGo gdy nie znasz nawet podstaw.
Moje skrypty:
Dwa ostrza |Unbalance 1.2

Frizbick

Frizbick

Użytkownicy
posty142
Propsy46
ProfesjaGracz
  • Użytkownicy
  • online
A dałoby się tak zrobić, żeby postać w jednej ręce trzymała kuszę a w drugiej miecz? :D Taki szalony pomysł mi przyszedł do głowy. Coś jak zabójca z Heroes 5 (http://www.tawerna.biz/h/5/jednostki/loch/s1_zabojca.jpg).
 

Halicor

Halicor

Użytkownicy
posty200
Propsy23
ProfesjaNierób
  • Użytkownicy
  • online
Pewnie się da ale trzeba też mieć animacje.
 

Kempix

Kempix

Użytkownicy
posty76
Propsy1
ProfesjaSkrypter
  • Użytkownicy
Hm wywala mi błąd przy: if(!C_BodyStateContains(hero,BS_STAND)){return;};
 

55TIGER39

55TIGER39

Użytkownicy
posty55
Propsy18
Profesjabrak
  • Użytkownicy
Jeśli o dark sagę chodzi to MDSy i animacje skompilowane już, człowiek sprytny wyciągnie sobie nawet i gomanem XD (Aczkolwiek wszystko pojedyńczo)
No ale są od tego udostępnione narządzia żeby nie robić sobie pod górkę.

Ja pamietam że u siebie robiłem prostym skryptem item oflagowany pod MDS jako broń i też działało.

Mniej więcej tym sposobem, tak

Cytuj
instance TARCZA_5(C_Item)
{
   name = "Stara tarcza Paladyna";
   mainflag = ITEM_KAT_FF;
   flags = ITEM_CROSSBOW;
   material = MAT_METAL;
   value = 1250;
   on_equip = equip_tarcza;
   on_unequip = unequip_tarcza;
   protection[PROT_EDGE] = 10;
   protection[PROT_BLUNT] = 10;
   protection[PROT_POINT] = 5;
   protection[PROT_FIRE] = 5;
   protection[PROT_MAGIC] = 4;
   munition = ItMi_StoneOfKnowlegde_MIS;
   cond_atr[2] = ATR_STRENGTH;
   cond_value[2] = 55;
   visual = "TARCZA_5.3DS";
   description = name;
   text[0] = "Bardzo stara,pamięta pierwsze wojny z Orkami.Obecnie nie używana przez zakon";
   text[1] = NAME_Prot_Edge;
   count[1] = protection[PROT_EDGE];
   text[2] = NAME_Prot_Point;
   count[2] = protection[PROT_POINT];
   text[3] = NAME_Prot_Fire;
   count[3] = protection[PROT_FIRE];
   text[4] = NAME_Str_needed;
   count[4] = cond_value[2];
   text[5] = NAME_Value;
   count[5] = value;
};

FUNC VOID Equip_tarcza()
{
self.protection [1] += item.protection [2];
self.protection [2] += item.protection [2];
self.protection [6] += item.protection [6];
self.protection [3] += item.protection [3];
self.protection [5] += item.protection [5];
Mdl_ApplyOverlayMds (self,"HUM_SHIELD2.msb");
};

FUNC VOID UnEquip_tarcza()
{
self.protection [1] -= item.protection [2];
self.protection [2] -= item.protection [2];
self.protection [6] -= item.protection [6];
self.protection [3] -= item.protection [3];
self.protection [5] -= item.protection [5];
Mdl_RemoveOverlayMds (self,"HUM_SHIELD2.msb");
};
 


0 użytkowników i 1 Gość przegląda ten wątek.
0 użytkowników
Do góry