Przed przeczytaniem polecam znać podstawy zmiennych i stałych.
Oraz warunki, niestety do nich nie znalazłem tutoriala(jak będzie to dam link)
Tak więc zaczynajmy
Pierwsze co to musimy zobaczyć jak wygląda sama klasa. Znajduje się ona w pliku Classes(uproszczona jej wersja-bez ikarusa) Scripts>Content>_Intern>Classes.d
CLASS C_Item
{
// Für alle Items
VAR INT id ;
VAR STRING name,nameID ;
VAR INT hp,hp_max ;
VAR INT mainflag,flags ; // Hauptflag und weitere Flags
VAR INT weight,value ;
// Für Waffen
VAR INT damageType ; // Welche Schadensarten
VAR INT damageTotal ;
VAR INT damage [DAM_INDEX_MAX] ;
// Für Rüstungen
VAR INT wear ;
VAR INT protection [PROT_INDEX_MAX];
// Für Nahrung
VAR INT nutrition ; // HP-Steigerung bei Nahrung
// Benötigte Attribute zum Benutzen des Items
VAR INT cond_atr [3] ;
VAR INT cond_value [3] ;
// Attribute, die bei anlegen des Items verändert werden
VAR INT change_atr [3] ;
VAR INT change_value [3] ;
// Parserfunktionen
VAR FUNC magic ; // Parserfunktion zum "Magie Header"
VAR FUNC on_equip ; // Parserfunktion, wenn Item equipped wird.
VAR FUNC on_unequip ; // Parserfunktion, wenn Item unequipped wird.
VAR FUNC on_state [4] ;
// Besitzer
VAR FUNC owner ; // Besitzer : Instanz-Name
VAR INT ownerGuild ; // Besitzer : Gilde
VAR INT disguiseGuild ; // Zur Schau getragene Gilde durch Verkleidung
// Die 3DS-Datei
VAR STRING visual ;
// Veränderung des NSC-Meshes beim Anlegen dieses Gegenstandes
VAR STRING visual_change ; // ASC - File
VAR STRING effect; // Effekt Instanz
VAR INT visual_skin ;
VAR STRING scemeName ;
VAR INT material ;
// VAR STRING pfx ; // Magic Weapon PFX
VAR INT munition ; // Instance of Munition
var int spell ;
var int range ;
var int mag_circle ;
VAR STRING description ;
VAR STRING text [ITM_TEXT_MAX] ;
VAR INT count [ITM_TEXT_MAX] ;
// inventory darstellungs geschichten, wird nur benutzt, falls von 0 abweichend
var int inv_zbias; // wie weit ist das item im inventory richtung far plane verschoben (integer scale 100=1)
var int inv_rotx; // wieviel grad um die x achse ist das item im inv gedreht
var int inv_roty; // wieviel grad um die y achse ist das item im inv gedreht
var int inv_rotz; // wieviel grad um die z achse ist das item im inv gedreht
var int inv_animate; // soll das item in inv rotiert werden
};
Dobrze jak widzimy jest tam masa zmiennych np. var int range;
"Kpisz sobie z nas!? Przecież to jest w broniach i ustala zasięg."
Tak, ale kto nam zabroni to dodać do skryptu chleba!? Nikt! Możemy dodać zasięg nie tylko do broni, ale do wszystkiego. I tak nie bijemy tym ponieważ... Pytanie za 100 pkt. od czego!?
Spoiler
Tak brawo zgadłeś! Od tego! VAR INT mainflag,flag;
Wiemy, że nasz chlebek ma mainflagę "ITEM_KAT_FOOD" a mieczyk "ITEM_SWD".
Dobrze koniec teorii teraz przykładowe zastosowanie.
Dajmy sobie że zrobiliśmy 100 naszych chlebków i każdy ma odnawiać inną liczbę życia (od 1 do 101).
I co mamy tworzyć 100 funkcji? Oczywiście.
Spoiler
Że nie
Tworzymy jedną funkcję która będzie wykorzystywać naszą zmienną var int range.
INSTANCE ItFo_NaszBoskiChlebek1 (C_Item)
{
name = "Dzieło piekarni!";
mainflag = ITEM_KAT_FOOD;
flags = ITEM_MULTI;
range = 10;
value = Value_Shellflesh;
visual = "chlebek.3DS";
material = MAT_LEATHER;
scemeName = "FOODHUGE";
on_state[0] = USE_SPECIALCHLEB;
description = name;
TEXT[0] = "Miętki i chrupiący!";
};
Jak widzimy ustawiłem funkcję na USE_SPECIALCHLEB. I teraz do każdego z naszych 100 chlebków możemy ją przypisać.
I co już działa? Nie, bo nie napisaliśmy funkcji która ma nam dodawać życie.
A więc tak:
func void USE_SPECIALCHLEB(){ //Nazwa funkcji proste :F
if(item.range>0){ //Warunek if-Jeżeli item.range- zasięg naszego przedmiotu >0 - jest większy od 0 {- to
Npc_ChangeAttribute (self, ATR_HITPOINTS, item.range); //self -Dodaj spożywającemu, ATR_HITPOINTS - punktów życia, item.range-- tyle ile nasz chleb ma zasięgu czyli w naszym przypadku 10
};//kończy warunek
};//kończy funkcję
Chyba zrozumiałe? He he łatwe prawda
To na razie chyba wszystko dzięki temu mamy łatwy dostęp do zmiany atrybutów naszego bohatera tylko dzięki zmiennej z klasy!
Malutkie uwagi!
Pamiętajcie że do naszej funkcji możemy dodać więcej warunków. Zależnych od wymaganego atrybuty, czy innych zmiennych z ów klasy.
Przykładowo
func void Rechange_Attribute(){
if(item.range>0){
HP_PROC (item.range);
if(Npc_IsPlayer(self)){
var string msg;
msg = ConcatStrings("Punkty trafień + ",inttostring(item.range));
msg = ConcatStrings(msg," = ");
msg = ConcatStrings(msg,inttostring(hero.attribute[ATR_HITPOINTS]));
msg = ConcatStrings(msg,"/");
msg = ConcatStrings(msg,inttostring(hero.attribute[ATR_HITPOINTS_MAX]));
PutMsg(msg,"font_default.tga",RGBAToZColor(255,100,100,255),4,"");
};
if(Npc_IsPlayer(self)){//Stamina xD kurwa czemu chciałem zmęczenie potionem liczyć E:
if(item.cond_atr[0]>0){
Stamina += item.cond_atr[0];
var string cmsg;
cmsg = ConcatStrings("Wytrzymałość + ",inttostring(item.cond_atr[0]));
Putmsg(cmsg,"font_default.tga",RGBAToZColor(255,165,0,255),4,"");
};
};
if(Npc_IsPlayer(self)){ //Głód
if(item.cond_atr[1]>0){
hunger -= item.cond_atr[1];
var string MSGG;
MSGG=ConcatStrings("Głód + ",inttostring(item.cond_atr[1]));
PutMSG(MSGG,"font_default.tga",RGBAToZColor(255,255,255,255),4,"");
};
};
};
if(Npc_IsPlayer(self)){ //Pragnienie
if(item.cond_atr[2]>0){
desire -=item.cond_atr[2];
var string MSGGG;
MSGGG =ConcatStrings("Pragnienie + ",inttostring(item.cond_atr[2]));
PutMSG(MSGGG,"font_default.tga",RGBAToZColor(0,160,255,255),4,"");
};
};
if(item.change_value[1]>0){
MP_PROC (item.change_value[1]);
if(Npc_IsPlayer(self)){
var string comsg;
comsg = ConcatStrings("Punkty many + ",inttostring(item.change_value[1]));
comsg = ConcatStrings(comsg," = ");
comsg = ConcatStrings(comsg,inttostring(hero.attribute[ATR_HITPOINTS]));
comsg = ConcatStrings(comsg,"/");
comsg = ConcatStrings(comsg,inttostring(hero.attribute[ATR_HITPOINTS_MAX]));
PutMsg(comsg,"font_default.tga",RGBAToZColor(100,100,255,255),4,"");
};
};
};
Wykorzystując zmienne przypisałem dodawanie głodu, życia, pragnienia wytrzymałości i many.
Później wystarczy tylko pożywienie przerobić pod ów funkcję.
(Ta funkcja nie zadziała na kopiuj-Wklej ponieważ nie posiadacie zmiennych musicie je sami dodać oraz wyrzucić system powiadomieć(piszę to bo nie chciał bym komentarzy typu. Twoja funkcja nie działa.))
Dzięki za uwagę !