Postanowiłem że pomogę w miare możliwości, mam nadzieje ze ktoś zrobi uczynek, fajnie by to było zobaczyć w jakimś modzie .
Jest w miare sensowny i wcale nie taki trudny sposób, który powinien dać conajmniej dobry efekt.
Jedyny powazny problem - z tego co sie orientuje to problem z pfxami - mianowicie zaczynaja się one wyświetlać jeszcze przed tym jak "podepną" sie do odpowiedniej częsci ciała, co powoduje ze mogą być wyswietlane w zlej pozycji. Ale możliwe że da się ten problem jakoś rozwiazać.
Taką dzieloną zbroje może nosić tylko określona liczba NPC/PC która sami zreszta musimy określic - lepiej jeśli chcemy mieć npc z mieszanymi zbrojami zrobic to za pomocą mieszania całości zbroi w .asc, taka sugestia.
Teoretycznie i w skrócie, jak to wyglada:
W pewnej jednostce czasu (przyjmijmy 1 sekundę) wykonuje się skrypt (Timetrigger/ticktock) Który sprawdza wg. zmiennych jakie elementy zbroi mamy załozone, przyjmijmy na poczatek kilka liczb oznaczających zbroje:
const int ARMOR_NONE = 0;
const int ARMOR_THIEF = 1;
const int ARMOR_GRD_HEAVY = 2;
//itd.
//Teraz częsci ciała, potem moge nawet pomóc w rozpisaniu calej listy.
//VAR NAME || ZS/BIP NAME
var int ARMORPART_HELM;// ZS_HELMET
var int ARMORPART_BOOTS;//Bip01 R Foot & Bip01 L Foot
var int ARMORPART_BRACER;//Bip01 R Clavicle & Bip01 L Clavicle
var int ARMORPART_BREASTPLATE;//Bip01 Spine2 LUB Bip01 Spine1 //zależnie od modelu zbroi
var int ARMORPART_GRAVES;//Bip01 R Thigh & Bip01 L Thigh
//Możliwość podzialu czesci zbroi równie na Lewą i prawą.
//Teraz obrona poszczególnych częsci ciała, jako że tablice nie funkcjonuja jak powinny, wszystko
//zrobimy na zwykłych var-ach.
//HELM
var int PROT_HELM_EDGE; //OSTRZE
var int PROT_HELM_BLUNT;//OBUCH
var int PROT_HELM_POINT;//POCISKI
var int PROT_HELM_FIRE;//OGIEN
var int PROT_HELM_MAGIC;//MAGIA
//Obrona przed bronia = EDGE i BLUNT
//BOOTS
var int PROT_BOOTS_EDGE;
var int PROT_BOOTS_BLUNT;
var int PROT_BOOTS_POINT;
var int PROT_BOOTS_FIRE;
var int PROT_BOOTS_MAGIC;
//Kopjujemy tekst i zamieniamy teraz BOOTS na BRACER, i zlatuje szybciej, ale najlepszy i tak jest column mode;p
//BRACER
var int PROT_BRACER_EDGE;
var int PROT_BRACER_BLUNT;
var int PROT_BRACER_POINT;
var int PROT_BRACER_FIRE;
var int PROT_BRACER_MAGIC;
//itd.
//bez problemu można dodać też inne np. FLY, FALL, BARRIER itd.
//Teraż przejdzmy do samego triggera, rozpisze kawalek funkcji jakby mialo to wygladać.
func void ARMOR_CHECK()
{
//---------------------
// HELM -ZS_HELMET
//---------------------
//Zdaje sobie sprawe ze hełm można zrobić prostrzym sposobem;P
if(ARMORPART_HELM==ARMOR_NONE)//lub poprostu (!ARMORPART_HELM)
{
//Render nothing.
}
else if(ARMORPART_HELM==ARMOR_THIEF)
{
//Render helm of thief armor.
Wld_PlayEffect("V_ARMOR_THIEF_HELM",hero,hero,0,0,0,FALSE);
}
else//(Lub jesli bedzie wiecej) if(ARMORPART_HELM==ARMOR_GRD_HEAVY)
{
//Render helm of heavy old camp guard armor.
Wld_PlayEffect("V_ARMOR_GRD_HEAVY_HELM",hero,hero,0,0,0,FALSE);
};
//---------------------
// BOOTS
//-Bip01 R Foot & Bip01 L Foot
//---------------------
if(ARMORPART_BOOTS==ARMOR_NONE)//lub poprostu (!ARMORPART_BOOTS)
{
//Render nothing.
}
else if(ARMORPART_BOOTS==ARMOR_THIEF)
{
//Render thief boots.
//RIGHT:
Wld_PlayEffect("V_ARMOR_THIEF_RFOOT",hero,hero,0,0,0,FALSE);
//LEFT:
Wld_PlayEffect("V_ARMOR_THIEF_LFOOT",hero,hero,0,0,0,FALSE);
}
else//(Lub jesli bedzie wiecej) if(ARMORPART_BOOTS==ARMOR_GRD_HEAVY)
{
//Render heavy old camp guard boots.
//RIGHT:
Wld_PlayEffect("V_ARMOR_GRD_HEAVY_RFOOT",hero,hero,0,0,0,FALSE);
//LEFT:
Wld_PlayEffect("V_ARMOR_GRD_HEAVY_LFOOT",hero,hero,0,0,0,FALSE);
};
//...itd.
//WLD_SENDTRIGGER("NAZWATRIGGERA"); ->najlepiej jednak zrobic pętle w spacerze.
};
//Czas ma przykłady efektów VFX (czyli tego z Wld_PlayEffect)
//VFX - PRAWY BUT ZBOI ZLODZIEJA
instance V_ARMOR_THIEF_RFOOT (CFx_Base_Proto) // HEAL ORIGIN wird automatisch über emFXInvestOrigin_S getriggert. Aura um den Spieler
{
visname_S = "P_ARMOR_THIEF_RFOOT";//PFX - najlepiej nazywac wszystko wedlug jakiegos systemu, bedzie nam dużo łatwiej wszystko ogarnąc póżniej.
//Być może dla poprawy efektu, bedzie trzeba zmodyfikowac wartości PONIŻEJ.
visAlpha = 1;
emtrjmode_s = "FIXED";
//Być może dla poprawy efektu, bedzie trzeba zmodyfikowac wartości POWYŻEJ.
emTrjOriginNode = "Bip01 Spine1";//Bip do którego bedzie przyłączony PFX.
// LightPresetname = "AURA";
emFXLifeSpan = 1;//Czas trwania VFX'a, w naszym wypadku 1 (sekunda) - tak jak czas co jaki powtarza sie trigger.
};
//VFX - HEŁM CIĘŻKIEJ ZBROI STRAŻNIKA
instance V_ARMOR_GRD_HEAVY_HELM (CFx_Base_Proto) // HEAL ORIGIN wird automatisch über emFXInvestOrigin_S getriggert. Aura um den Spieler
{
visname_S = "P_ARMOR_GRD_HEAVY_HELM";//PFX - najlepiej nazywac wszystko wedlug jakiegos systemu, bedzie nam dużo łatwiej wszystko ogarnąc póżniej.
//Być może dla poprawy efektu, bedzie trzeba zmodyfikowac wartości PONIŻEJ.
visAlpha = 1;
emtrjmode_s = "FIXED";
//Być może dla poprawy efektu, bedzie trzeba zmodyfikowac wartości POWYŻEJ.
emTrjOriginNode = "Bip01 Spine1";//Bip do którego bedzie przyłączony PFX.
// LightPresetname = "AURA";
emFXLifeSpan = 1;//Czas trwania VFX'a, w naszym wypadku 1 (sekunda) - tak jak czas co jaki powtarza sie trigger.
};
//Czas na jakieś przykładowe PFXy - same pfxy maja za zadanie, nie jakby sie wydawalo, wyswietlanie czasteczek, a render mesha
//na którym te cząsteczki będa oparte - same cząsteczki mają być niewidzialne i w jaknajmniejszej ilosci.
//PFX - PRAWY BUT ZBROI ZŁODZIEJA
INSTANCE P_ARMOR_THIEF_RFOOT (C_PARTICLEFX)
{
ppsvalue = 3;
ppsscalekeys_s = "1";
ppsfps = 1;
shptype_s = "MESH";
shpfor_s = "object";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "walk";
shpdim_s = "1";
shpmesh_s = "M_ARMOR_THIEF_RFOOT.3ds";//Kolejna nazwa - ze schematu - tu wstawic nazwe modelu czesci zbroi
ShpMeshRender_B = 1;
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 1;
dirmode_s = "NONE";
velavg = 1.99999996e-012;
lsppartavg = 400;
flygravity_s = "0 0.000 0";
visname_s = "MAGICDUMMY16BIT_4.TGA";
visorientation_s = "NONE";
vistexisquadpoly = 0;
vistexanifps = 15;
vistexaniislooping = 1;
vistexcolorstart_s = "195 255 255";
vissizestart_s = "1 1";
vissizeendscale = 1;
visalphafunc_s = "NONE";
visalphastart = 1;
visalphaend = 1;
};
//PFX - HEŁM CIĘŻKIEJ ZBROI STRAŻNIKA
INSTANCE P_ARMOR_GRD_HEAVY_HELM (C_PARTICLEFX)
{
ppsvalue = 3;
ppsscalekeys_s = "1";
ppsfps = 1;
shptype_s = "MESH";
shpfor_s = "object";
shpoffsetvec_s = "0 0 0";
shpdistribtype_s = "walk";
shpdim_s = "1";
shpmesh_s = "M_ARMOR_GRD_HEAVY_HELM.3ds";//Kolejna nazwa - ze schematu - tu wstawic nazwe modelu czesci zbroi
ShpMeshRender_B = 1;
shpscalekeys_s = "1";
shpscaleislooping = 1;
shpscaleissmooth = 1;
shpscalefps = 1;
dirmode_s = "NONE";
velavg = 1.99999996e-012;
lsppartavg = 400;
flygravity_s = "0 0.000 0";
visname_s = "MAGICDUMMY16BIT_4.TGA";
visorientation_s = "NONE";
vistexisquadpoly = 0;
vistexanifps = 15;
vistexaniislooping = 1;
vistexcolorstart_s = "195 255 255";
vissizestart_s = "1 1";
vissizeendscale = 1;
visalphafunc_s = "NONE";
visalphastart = 1;
visalphaend = 1;
};
//No i niby wszystko jest zupełnie git, ale pewnie wielu z was już sie zastanawiało jak niby zrobić to żeby dało się założyc
//np. 10 róznych czesci zbroi naraz, jako pierścienie? jako pas? a może jako hełm? nic takiego, jako że wczesniej miałem
//podobny problem napisałem skrypt do itemów który pozwoli ci "założyc" nawet bryłki rudy, wlaściwie to to hack :P.
//Przykładowe itemy:
INSTANCE I_ARMOR_GRD_HEAVY_HELM(C_Item)//Instance itema jak widać bazowany na tym samym co zawsze
{
name = "Ciężki hełm strażnika";//NAZWA? :P
mainflag = ITEM_KAT_ARMOR;
flags = 0;
protection [PROT_EDGE] = 7;
protection [PROT_BLUNT] = 7;
protection [PROT_POINT] = 5;
protection [PROT_FIRE] = 5;
protection [PROT_MAGIC] = 1;
value = 175;
visual = "M_ARMOR_GRD_HEAVY_HELM.3ds";//Ten sam mesh co PFX - powinno wyglądać w miare
material = MAT_METAL;
description = name;
scemename = "NONE";//Nowy schemat taki sam jak np. czytanie mapy, picie piwa - z tym że animacja
//jest niezauwazalna i odrazu przechodzi do akcji, podłączego go potem jako załącznik.
//NARAZIE MOŻECIE DAC "MAP"
on_state[0] = PART_HELM;//Dla wszystkich hełmów ta sama funkcja
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_Prot_Magic; COUNT[4] = protection [PROT_MAGIC];
TEXT[5] = NAME_Value; COUNT[5] = value;
};
INSTANCE I_ARMOR_THIEF_BOOTS(C_Item)//Odstepstwo od typowej reguły, bo buty są jako jeden przemiot, a PFXy i VFXy są 2.
{
name = "Buty złodzieja";
mainflag = ITEM_KAT_ARMOR;
flags = 0;
protection [PROT_EDGE] = 5;
protection [PROT_BLUNT] = 5;
protection [PROT_POINT] = 2;
protection [PROT_FIRE] = 1;
protection [PROT_MAGIC] = 0;
value = 175;
visual = "M_ARMOR_GRD_HEAVY_HELM.3ds";//Ten sam mesh co PFX - powinno wyglądać w miare
material = MAT_METAL;
description = name;
scemename = "NONE";//Nowy schemat taki sam jak np. czytanie mapy, picie piwa - z tym że animacja
//jest niezauwazalna i odrazu przechodzi do akcji, podłączego go potem jako załącznik.
//NARAZIE MOŻECIE DAC "MAP"
on_state[0] = PART_BOOTS;//Dla wszystkich butów ta sama funkcja
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_Prot_Magic; COUNT[4] = protection [PROT_MAGIC];
TEXT[5] = NAME_Value; COUNT[5] = value;
};
//Teraz czas na funkcje które beda wywoływać te częsci zbroi - maja one na celu
//1. Usawić przedmiot jako założony - wczesniej zdejmując inne z tej samej kategorii np. zakładając
//ciezkie buty strażnika, zdejmuja się nam automatycznie buty złodzieja.
//2. Odjąc punkty obrone poprzednio używanego przedmiotu i dodać obrone nowego przedmiotu.
//Funkcja zbiorowa butów
func void PART_BOOTS()
{
var c_item itm;//wymagana zmienna pomocnicza.
//Musimy zączać od sprawdzenia w jakims stanie są obecnie "użyte buty"
//Jeśli są założone, gracz napewno chce je zdjąć, jeżeli nie są założone musi być na odwrót.
//Dodam że zmienna item w obecnej chwil przechowuje używany C_ITEM, co oczywiscie bardzo szeroko wykorzystamy;P.
//Nie jestem pewien, ale zmienna 'self' przechowuje raczej osobe która dany przedmiot używa, z racji ze nie jestem pewny,
//będe poprostu korzystał z 'hero'.
if(item.flags==0)//0 to wartość początkowa, czyli taka przy której przedmiot nie jest założony, wiec gracz chce go ZAŁOŻYĆ.
{
//Zaczynamy od zdjęcia starego przedmiotu, nie bawimy sie w zaawansowane funkcje sprawdzające czy przedmiot był załozony.
//Poprostu wykonujemy operacje przy każdym przedmiocie który jest w ekwipunku herosa i mógł być założony.
//Buty złodzieja:
if(Npc_HasItems(hero,I_ARMOR_THIEF_BOOTS))//takie sprawdzenie zwróci prawde jeśli ilość tych przedmiotów to bedzie równa jeden lub więcej.
{
itm = Npc_GetInvItem(hero,I_ARMOR_THIEF_BOOTS);
itm.flags = 0;//zdejmujemy wszelkie flagi itemowi, teraz napewno nie będzie "załozony".
};
//Ciężkie buty strażnika:
if(Npc_HasItems(hero,I_ARMOR_GRD_HEAVY_BOOTS))//
{
itm = Npc_GetInvItem(hero,I_ARMOR_GRD_HEAVY_BOOTS);
itm.flags = 0;
};
//itd. w wypadku wiekszej ilosci przedmiotów
//Wszystkie ewentualnie założone przedmioty mamy już zdjete, teraz czas na odjęcie punktów obrony:
hero.protection [PROT_EDGE] -=PROT_BOOTS_EDGE;
hero.protection [PROT_BLUNT]-=PROT_BOOTS_BLUNT;
hero.protection [PROT_POINT]-=PROT_BOOTS_POINT;
hero.protection [PROT_FIRE] -=PROT_BOOTS_FIRE;
hero.protection [PROT_MAGIC]-=PROT_BOOTS_MAGIC;
//zmiennym przypisujemy nowe wartosci obrony:
PROT_BOOTS_EDGE = item.protection[PROT_EDGE];
PROT_BOOTS_BLUNT = item.protection[PROT_BLUNT];
PROT_BOOTS_POINT = item.protection[PROT_POINT];
PROT_BOOTS_FIRE = item.protection[PROT_FIRE];
PROT_BOOTS_MAGIC = item.protection[PROT_MAGIC];
//teraz ustawiamy je bohaterowi:
hero.protection [PROT_EDGE] +=PROT_BOOTS_EDGE;
hero.protection [PROT_BLUNT]+=PROT_BOOTS_BLUNT;
hero.protection [PROT_POINT]+=PROT_BOOTS_POINT;
hero.protection [PROT_FIRE] +=PROT_BOOTS_FIRE;
hero.protection [PROT_MAGIC]+=PROT_BOOTS_MAGIC;
//pozostało tyło jeszcze "założyć" przedmiot, musimy tylko przypisać mu specjalna flage:
item.flags = 1<<30;
};
};
//Funkcja zbiorowa hełmów
func void PART_HELM()
{
var c_item itm;
//Ta sama spiewka co w wypadku Butów, tym razem bez zbednych juz chyba komentarzy.
if(item.flags==0)
{
if(Npc_HasItems(hero,I_ARMOR_THIEF_HELM))
{
itm = Npc_GetInvItem(hero,I_ARMOR_THIEF_HELM);
itm.flags = 0;
};
if(Npc_HasItems(hero,I_ARMOR_GRD_HEAVY_HELM))
{
itm = Npc_GetInvItem(hero,I_ARMOR_GRD_HEAVY_HELM);
itm.flags = 0;
};
hero.protection [PROT_EDGE] -=PROT_HELM_EDGE;
hero.protection [PROT_BLUNT]-=PROT_HELM_BLUNT;
hero.protection [PROT_POINT]-=PROT_HELM_POINT;
hero.protection [PROT_FIRE] -=PROT_HELM_FIRE;
hero.protection [PROT_MAGIC]-=PROT_HELM_MAGIC;
PROT_HELM_EDGE = item.protection[PROT_EDGE];
PROT_HELM_BLUNT = item.protection[PROT_BLUNT];
PROT_HELM_POINT = item.protection[PROT_POINT];
PROT_HELM_FIRE = item.protection[PROT_FIRE];
PROT_HELM_MAGIC = item.protection[PROT_MAGIC];
hero.protection [PROT_EDGE] +=PROT_HELM_EDGE;
hero.protection [PROT_BLUNT]+=PROT_HELM_BLUNT;
hero.protection [PROT_POINT]+=PROT_HELM_POINT;
hero.protection [PROT_FIRE] +=PROT_HELM_FIRE;
hero.protection [PROT_MAGIC]+=PROT_HELM_MAGIC;
item.flags = 1<<30;
};
};
//Na koniec kilka słow o samym meshu/modelu czesci zbroi, jedynie w teorii, bo grafikiem nie jestem, wiec przykładu
//raczej nie zrobie.
//-Całość trzeba wypozycjonować tak żeby BIP/ZS do którego jest przyporządkowana cześć zbroi była punktem 0,0,0 na scenie
//kopjujemy najlepiej potrzebnego bipa, razem z czescia mesha ze zbroi która będzie nam potrzebna, wszystko pozycjonujemy,
//na koniec usuwamy bipeda i zostawiamy samą część zbroi.
//-Warto aby kawałki zbroi które sobie tak utworzymy zamknąć, mimo tego ze ciało spod spodu bedzie widoczne, czasami beda sie napewno
//pojawiac puste przestrzenie, wtedy zamkniecie modelu znacznie poprawiło by efekt, niemówiac juz o dopasowaniu elementów z róznych
//zbrói - w wypadku zamkniecia modelu bedzie to wygladalo znacznie lepiej.
Gdyby ktoś chciał się za to zabrać, to jestem w stanie pomóc i doradzic, no chyba ze to by był mod który dodaje królewskich
gwardzistów, wtedy bym sie poważnie zastanowił - osobiscie proponuje wydać to w postaci łatki do gothica.
Całość była pisana pod G1, skrypty nie były testowane, ale staralem się nie popełniac błędów.
Czekam na jakąkolwiek dyskusje, zainteresowanie, no i nie przerażać się wielkoscia - jest taka a nie inna
przedewszystkim dlatego ze staralem sie wszystko wytlumaczyc komentarzami.