Znalazło się kilka problemów z którymi nie daję sobie rady. Za 1 rozwiązany problem daję propsa.
Dobra, koniec pierdół.
1) Specjalna broń na daną gildię potwora - chciałem zrobić przykładowo łuk, który zadawałby 20 obrażeń więcej ścierwojadom. Chodzi mi o warunek. Jest takie coś jak:
if (self.guild == GIL_STT)
Jednak nie działa on na gildię stworków.
2) Hammerite. Tak, po przeczytaniu tego pomyśleliście zapewne "WTF?". Wpadłem na nieco dziwny pomysł zrobienia takiego dodatku do broni, który zwiększałby obrażenia i starczyłby na 50 uderzeń. Jest słoik otwarty i zamknięty.
INSTANCE ItMi_Smar_01 (C_Item)
{
name = "Smar do broni";
mainflag = ITEM_KAT_NONE;
flags = ITEM_MULTI;
value = 100;
visual = "Smar_01.3ds";
material = MAT_METAL;
description = name;
TEXT[0] = "'Made in China'";
TEXT[1] = "Bonus do obrażeń: 20";
TEXT[4] = NAME_Value; COUNT[4] = value;
};
INSTANCE ItMi_Smar_Otwarty_01 (C_Item)
{
name = "Smar do broni (otwarty)";
mainflag = ITEM_KAT_NONE;
flags = ITEM_MULTI;
value = Value_Smar_01;
visual = "Smar_Otwarty_01.3ds";
material = MAT_METAL;
description = name;
TEXT[0] = "'Made in China'";
TEXT[1] = "Bonus do obrażeń: 20";
TEXT[4] = NAME_Value; COUNT[4] = value;
};
Value_smar_01 to zmienna, ustaliłem jej wartość w startupie. Następnie w ReactToDamage.d (Ave Avallach

)
if (Npc_HasItems (hero, ItMi_Smar_01) >=1)
&& (!Npc_HasItems (hero, ItMi_Smar_otwarty_01) >=1) //Jeśli mam tylko zamknięty
{
NPC_ChangeAttribute(self,ATR_HITPOINTS, - 20);
CreateInvItem (hero, ItMi_Smar_otwarty_01); //Otwieramy jeden ;-]
NPC_RemoveInvItem (hero, ItMi_Smar_01); //Czyli ten won
Value_Smar_01 = Value_Smar_01 - 2; //Zmienia się wartość po użyciu
if (Value_Smar_01 == 0) //Jeśli spadnie do 0 (zużyje się)
{
NPC_RemoveInvItem (hero, Itmi_Smar_otwarty_01); //Wywalamy...
Value_Smar_01 == 100; //I czas na kolejny
};
};
if (Npc_HasItems (hero, ItMi_Smar_otwarty_01) >=1) //Jeśli mamy tylko otwarty... A co będę tłumaczyć. :-|
{
NPC_ChangeAttribute(self,ATR_HITPOINTS, - 20);
Value_Smar_01 = Value_Smar_01 - 2;
if (Value_Smar_01 == 0)
{
NPC_RemoveInvItem (hero, Itmi_Smar_otwarty_01);
Value_Smar_01 == 100;
};
};
Błędów nie wywala, ale nie zadaje żadnych obrażeń. Tylko kiedy uderzam pierwszy raz, zmienia się wartość przedmiotu. Skończyły mi się pomysły na naprawienie tego skryptu...
3) Armie stworków. Coś czuję, że ten temat był poruszany już nieraz, jednak nie mogłem go znaleźć na forum. Skorzystałem z
tej metody respawnu. Dodałem tam 6 stworków, jednak po północy przywołało ich tyle, że Goticzek nie wytrzymał...
4) Atrybut = obrażenia. Wpadłem na pomysł zrobienia szabli, która im więcej mamy zręczności, tym więcej zadawałaby obrażeń. Kombinowałem na różne sposoby. Zrobiłem najpierw zmienną "Obrazenia_01" i w startupie ustaliłem jej wartość:
Obrazenia_01 = self.attribute[ATR_DEXTERITY] / 2;
I zrobiłem skrypt broni...
INSTANCE Itmw_rapier_01(C_Item)
{
name = "Zdobiony rapier";
mainflag = ITEM_KAT_NF;
flags = ITEM_SWD;
material = MAT_METAL;
value = 760;
damageTotal = Obrazenia_01;
damagetype = DAM_EDGE;
range = 130;
cond_atr[2] = ATR_DEXTERITY;
cond_value[2] = 20;
visual = "Rapier.3DS";
description = name;
TEXT[0] = "Im więcej mam zręczności";
TEXT[1] = "Tym większe zadaje obrażenia!";
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Dex_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_OneHanded;
TEXT[5] = NAME_Value; COUNT[5] = value;
};
No i rzecz jasna lipa. Broń nie zadaje żądnych obrażeń...
5) Nastawienie stworków. Po tym jak opanowałem robienie zestawów, zrobiłem set druida. Po założeniu kilku przedmiotów z zestawu, nie atakowałyby gracza niektóre stworki. Oto skrypt jednego z przedmiotów:
INSTANCE Itmw_kostur_druid (C_Item)
{
name = "Kostur Druida";
mainflag = ITEM_KAT_NF;
flags = ITEM_2HD_AXE;
material = MAT_METAL;
value = 1380;
damageTotal = 105;
damagetype = DAM_MAGIC;
range = 170;
cond_atr[2] = ATR_MANA;
cond_value[2] = 98;
visual = "Kostur_druid_01.3DS";
on_equip = Equip_kostur_1_druid;
on_unequip = UnEquip_kostur_1_druid;
description = name;
TEXT[1] = "Set druida";
TEXT[2] = NAME_Damage; COUNT[2] = damageTotal;
TEXT[3] = NAME_Str_needed; COUNT[3] = cond_value[2];
TEXT[4] = NAME_TwoHanded;
TEXT[5] = NAME_Value; COUNT[5] = value;
};
FUNC VOID Equip_kostur_1_druid()
{
Set_druid = Set_druid + 1;
if (Set_druid == 2)
{
Npc_SetTrueGuild (scavenger,GIL_MEATBUG);
Npc_SetTrueGuild (yscavenger,GIL_MEATBUG);
PrintScreen ("Teraz mnie nie atakują ścierwojady!", -1,-1,"FONT_15_WHITE.TGA",2);
};
if (Set_druid == 3)
{
Npc_SetTrueGuild (molerat,GIL_MEATBUG);
Npc_SetTrueGuild (ymolerat,GIL_MEATBUG);
Npc_SetTrueGuild (bloodfly,GIL_MEATBUG);
PrintScreen ("Teraz mnie nie atakują kretoszczury i krwiopijcy!", -1,-1,"FONT_15_WHITE.TGA",2);
};
if (set_druid == 4)
{
Npc_SetTrueGuild (wolf,GIL_MEATBUG);
Npc_SetTrueGuild (greengobboclub,GIL_MEATBUG);
Npc_SetTrueGuild (greengobbosword,GIL_MEATBUG);
Npc_SetTrueGuild (blackgobbomace,GIL_MEATBUG);
Npc_SetTrueGuild (blackgobbowarrior,GIL_MEATBUG);
PrintScreen ("Teraz mnie nie atakują wilki i gobliny!", -1,-1,"FONT_15_WHITE.TGA",2);
};
if (set_druid == 5)
{
Npc_SetTrueGuild (lurker,GIL_MEATBUG);
Npc_SetTrueGuild (waran,GIL_MEATBUG);
Npc_SetTrueGuild (razor,GIL_MEATBUG);
Npc_SetTrueGuild (snapper,GIL_MEATBUG);
Npc_SetTrueGuild (shadowbeast,GIL_MEATBUG);
Npc_SetTrueGuild (troll,GIL_MEATBUG);
Npc_SetTrueGuild (youngtroll,GIL_MEATBUG);
PrintScreen ("Teraz mnie nie zaatakuje żadne zwierzę!", -1,-1,"FONT_15_WHITE.TGA",2);
};
};
FUNC VOID UnEquip_kostur_1_druid()
{
Set_druid = Set_druid - 1;
if (Set_druid == 1)
{
Npc_SetTrueGuild (scavenger,GIL_SCAVENGER);
Npc_SetTrueGuild (yscavenger,GIL_SCAVENGER);
};
if (Set_druid == 2)
{
Npc_SetTrueGuild (molerat,GIL_MOLERAT);
Npc_SetTrueGuild (ymolerat,GIL_MOLERAT);
Npc_SetTrueGuild (bloodfly,GIL_BLOODFLY);
};
if (set_druid == 3)
{
Npc_SetTrueGuild (wolf,GIL_WOLF);
Npc_SetTrueGuild (greengobboclub,GIL_GOBBO);
Npc_SetTrueGuild (greengobbosword,GIL_GOBBO);
Npc_SetTrueGuild (blackgobbomace,GIL_GOBBO);
Npc_SetTrueGuild (blackgobbowarrior,GIL_GOBBO);
};
if (set_druid == 4)
{
Npc_SetTrueGuild (lurker,GIL_LURKER);
Npc_SetTrueGuild (waran,GIL_WARAN);
Npc_SetTrueGuild (razor,GIL_SNAPPER);
Npc_SetTrueGuild (snapper,GIL_SNAPPER);
Npc_SetTrueGuild (shadowbeast,GIL_SHADOWBEAST);
Npc_SetTrueGuild (troll,GIL_TROLL);
Npc_SetTrueGuild (youngtroll,GIL_TROLL);
};
};
Nie miałem innego pomysłu niż zmiana gildii na chrząszcza.

Niestety, stworki nie zmieniają gildii i dalej gryzą. Domyślam się, że to ta sama przyczyna jak w punkcie 1.
6) Monolog. Przetrzepałem całe forum i nie znalazłem podobnego problemu do mojego. Niespecjalnie go ogarnąłem, więc zrobiłem to na podstawie dialogu.
INSTANCE DIA_PC_Hero_EXIT(C_INFO)
{
npc = PC_Hero;
nr = 999;
condition = DIA_PC_Hero_EXIT_Condition;
information = DIA_PC_Hero_EXIT_Info;
permanent = TRUE;
description = "KONIEC";
};
FUNC INT DIA_PC_Hero_EXIT_Condition()
{
return TRUE;
};
FUNC VOID DIA_PC_Hero_EXIT_Info()
{
AI_StopProcessInfos (self);
};
//***********************
//1 kawałek
//***********************
INSTANCE DIA_PC_Hero_MIESO1 (C_INFO)
{
npc = PC_Hero;
nr = 1;
condition = DIA_PC_Hero_MIESO1_Condition;
information = DIA_PC_Hero_MIESO1_Info;
permanent = TRUE;
description = "Usmaż 1 kawałek mięsa";
};
FUNC INT DIA_PC_Hero_MIESO1_Condition()
{
if (Npc_HasItems (other, ItFo_Mutton_raw) >=1)
{
return TRUE;
};
};
FUNC VOID DIA_PC_Hero_MIESO1_Info()
{
CreateInvItem (hero, ItFo_Mutton);
NPC_RemoveInvItem (hero, ItFo_Mutton_raw);
};
//***********************
//5 kawałków
//***********************
INSTANCE DIA_PC_Hero_MIESO5 (C_INFO)
{
npc = PC_Hero;
nr = 2;
condition = DIA_PC_Hero_MIESO5_Condition;
information = DIA_PC_Hero_MIESO5_Info;
permanent = TRUE;
description = "Usmaż 5 kawałków mięsa";
};
FUNC INT DIA_PC_Hero_MIESO5_Condition()
{
if (Npc_HasItems (other, ItFo_Mutton_raw) >=5)
{
return TRUE;
};
};
FUNC VOID DIA_PC_Hero_MIESO5_Info()
{
CreateInvItems (hero, ItFo_Mutton, 5);
NPC_RemoveInvItems (hero, ItFo_Mutton_raw, 5);
};
//***********************
//10 kawałków
//***********************
INSTANCE DIA_PC_Hero_MIESO10 (C_INFO)
{
npc = PC_Hero;
nr = 3;
condition = DIA_PC_Hero_MIESO10_Condition;
information = DIA_PC_Hero_MIESO10_Info;
permanent = TRUE;
description = "Usmaż 10 kawałków mięsa";
};
FUNC INT DIA_PC_Hero_MIESO10_Condition()
{
if (Npc_HasItems (other, ItFo_Mutton_raw) >=10)
{
return TRUE;
};
};
FUNC VOID DIA_PC_Hero_MIESO10_Info()
{
CreateInvItems (hero, ItFo_Mutton, 10);
NPC_RemoveInvItems (hero, ItFo_Mutton_raw, 10);
};
//***********************
//25 kawałków
//***********************
INSTANCE DIA_PC_Hero_MIESO25 (C_INFO)
{
npc = PC_Hero;
nr = 4;
condition = DIA_PC_Hero_MIESO25_Condition;
information = DIA_PC_Hero_MIESO25_Info;
permanent = TRUE;
description = "Usmaż 25 kawałków mięsa";
};
FUNC INT DIA_PC_Hero_MIESO25_Condition()
{
if (Npc_HasItems (other, ItFo_Mutton_raw) >=25)
{
return TRUE;
};
};
FUNC VOID DIA_PC_Hero_MIESO25_Info()
{
CreateInvItems (hero, ItFo_Mutton, 25);
NPC_RemoveInvItems (hero, ItFo_Mutton_raw, 25);
};
//***********************
//50 kawałków
//***********************
INSTANCE DIA_PC_Hero_MIESO50 (C_INFO)
{
npc = PC_Hero;
nr = 5;
condition = DIA_PC_Hero_MIESO50_Condition;
information = DIA_PC_Hero_MIESO50_Info;
permanent = TRUE;
description = "Usmaż 50 kawałków mięsa";
};
FUNC INT DIA_PC_Hero_MIESO50_Condition()
{
if (Npc_HasItems (other, ItFo_Mutton_raw) >=50)
{
return TRUE;
};
};
FUNC VOID DIA_PC_Hero_MIESO50_Info()
{
CreateInvItems (hero, ItFo_Mutton, 50);
NPC_RemoveInvItems (hero, ItFo_Mutton_raw, 50);
};
//***********************
//100 kawałków
//***********************
INSTANCE DIA_PC_Hero_MIESO100 (C_INFO)
{
npc = PC_Hero;
nr = 6;
condition = DIA_PC_Hero_MIESO100_Condition;
information = DIA_PC_Hero_MIESO100_Info;
permanent = TRUE;
description = "Usmaż 100 kawałków mięsa";
};
FUNC INT DIA_PC_Hero_MIESO100_Condition()
{
if (Npc_HasItems (other, ItFo_Mutton_raw) >=100)
{
return TRUE;
};
};
FUNC VOID DIA_PC_Hero_MIESO100_Info()
{
CreateInvItems (hero, ItFo_Mutton, 100);
NPC_RemoveInvItems (hero, ItFo_Mutton_raw, 100);
};
Ten skrypt wrzuciłem do story/events jak PATELNIA.D. każda patelnia w Starym obozie ma ustawiony ten monolog (tak, na pewno dobrze). Jednak kiedy użyje się patelni, dostaję tylko kawałek miesa, żaden dialog się nie wyświetla.:-)
7) No i wreszcie ostatni. Hełm. Wiem, że to jest banalne, jest jednak pewien haczyk... Przykładowy skrypt hełmu:
INSTANCE HelmPaladyna(C_Item)
{
name = "Hełm Paladyna";
mainflag = ITEM_KAT_NF; //Tutaj. Jeśli ustawię jako armor, będzie dobrze, tylko NPC nie beda mogli tego założyć. Jesli ustawię Item_Kat_Nf, będzie ustawiony jako broń i będzie można założyć nieskończonośc hełmów naraz...
flags = 0;
protection [PROT_EDGE] = 50;
protection [PROT_BLUNT] = 50;
protection [PROT_POINT] = 30;
protection [PROT_FIRE] = 40;
protection [PROT_MAGIC] = 30;
value = 1251;
wear = WEAR_HEAD;
visual = "helmPaladyna.3ds";
visual_skin = 0;
material = MAT_METAL;
description = name;
//TEXT[0] = "";
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;
};
Gdyby znalazł się jakiś sposób na zrobienie normalnego hełmu, byłoby fajnie ;-)
I to by było na tyle...