Ikarus (Pakiet skryptów) 283782 1020

O temacie

Autor orcwarrior

Zaczęty 11.06.2010 roku

Wyświetleń 283782

Odpowiedzi 1020

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy

pawbuj

Ikarus (Pakiet skryptów)
#1000 2018-09-20, 14:42(Ostatnia zmiana: 2018-09-20, 15:04)
To są gotowe rzeczy które mud-freak udostępnił. Można dodawać wszystko do dowolnej modyfikacji (Paski kinowe, Obrażenia obszarowe, zmienny przelicznik sprzedaży) Wystarczy tylko ogarnąć jak to działa.
trade-multiplier jest już w sp 1.7, ale reszta byłaby fajna.

Postaram się wkrótce napisać poradnik, bo to naprawdę fajna rzecz. SystemPack 1.7 pozwala implementować do modyfikacji własne skrypty bez potrzeby ich dekompilacji.
mam nadzieję. że do zimy się wyrobisz z tym manualem....
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Och... Wybacz, że mam ciekawsze zajęcia niż ślęczenie nad Gothiciem. Od kwietnia minęło 5 miesięcy. Przez ten czas sam mógłbyś się tego nauczyć. Mnie nikt tego tłumaczył, bo to jest proste jak konstrukcja cepa. Wystarczy spojrzeć na przykłady załączone przez Mud Freaka.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy

pawbuj

Ikarus (Pakiet skryptów)
#1002 2018-09-20, 21:41(Ostatnia zmiana: 2018-10-01, 12:00)
Och... Wybacz, że mam ciekawsze zajęcia niż ślęczenie nad Gothiciem. Od kwietnia minęło 5 miesięcy. Przez ten czas sam mógłbyś się tego nauczyć. Mnie nikt tego tłumaczył, bo to jest proste jak konstrukcja cepa. Wystarczy spojrzeć na przykłady załączone przez Mud Freaka.
Rzeczywiście nie jest to zbyt skomplikowane (może nie tak jak cep :) ).
Niedługo opublikuję parę przydatnych rzeczy.

efekt mojej pracy to
Gothic Quick Patch (link w podpisie).

dodaje kolorowe nazwy npc w zależności od nastawienia oraz kolorowe nazwy skrzyń na wzór G3.
Podmienia fonty na te z g2.
 

xXTVCraftXx

xXTVCraftXx

Użytkownicy
Arkhan Qualshy
posty28
Propsy4
ProfesjaNierób
  • Użytkownicy
  • Arkhan Qualshy
Witam, mam pewien problem z Ikarusem, kiedy chcę kompilować skrypt.
_Intern\float.d(212): Error: Unknown identifier: CALL_OPENNie rozumiem dlaczego pojawia się taki komunikat, skoro jeszcze w tym samym folderze taki identyfikator JEST (w pliku Ikarus.d)

----
Zła kolejność parsowania.
Dzięki, naprawione.
 
Za morzem hen, daleko stąd, gdzie boski fenomen..
Za morzem hen, daleko stąd, gdzie przygód jest godzien..
Za morzem hen, daleko stąd, gdzie dom rodzimy..
Za morzem hen, daleko stąd, gdzie powrót już niemożliwy..


Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Zła kolejność parsowania.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy

pawbuj

Ikarus (Pakiet skryptów)
#1005 2019-02-28, 11:03(Ostatnia zmiana: 2019-02-28, 13:42)
może ktoś ma pomysł dlaczego ta funkcja nie chce zwracać True (zawsze False) nawet kiedy mam właściwy klucz.

Door2.keyInstance wyświetlam normalnie printem.

 EDIT: Wiem string to nie instance. Spróbuję użyć MEM_AssignInst dla Door2.keyInstance

func int NEED_DOOR_KEY()//this is condition func
        {
        var oCNpc her; her = Hlp_GetNpc(hero);         
           var oCMobLockable Door2; Door2 = _^(her.focus_vob);
                   
        if (Npc_HasItems(hero,StrToint(Door2.keyInstance)) > 0)
       
        {           
        return TRUE;   
        }
        else if (Npc_HasItems(hero,StrToint(Door2.keyInstance)) == 0)
        {
        PrintScreen("it works!",-1,10,"FONT_OLD_10_WHITE.TGA",3);
        AI_PlayAni(hero,"T_DONTKNOW");
        AI_OutputSVM(hero,hero,"$NeedKey");
        return FALSE;
        };
   };
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
STR_ToInt zwraca inta otrzymanego z liczb zapisanych w stringu, a keyInstance nie zwraca id instancji w formie stringa, tylko jej nazwę, czyli symbol parsera. No i przypisując pointer do instancji bez sprawdzania czy nie zwraca nulla popełniasz jeden z najbardziej podstawowych błędów w korzystaniu z Ikarusa.

var oCNpc her; her = Hlp_GetNpc(hero);

if (!Hlp_Is_oCMobDoor(her.focus_vob)) {
    return true;
};

var oCMobLockable door; door = _^(her.focus_vob);
var int ptr; ptr = MEM_GetParserSymbol(door.keyInstance);

if (!ptr) { //jeśli drzwi nie mają przypisanego klucza lub jego instancja jest niepoprawna
    return true;
};

var zCPar_Symbol symb; symb = _^(ptr);
var oCItem itm; itm = _^(symb.offset);

if (!Npc_HasItems(hero, itm.instanz) {
    PrintScreen("it works!",-1,10,"FONT_OLD_10_WHITE.TGA",3);
    AI_PlayAni(hero,"T_DONTKNOW");
    AI_OutputSVM(hero,hero,"$NeedKey");
    return false;
};

return true;
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy

pawbuj

Ikarus (Pakiet skryptów)
#1007 2019-02-28, 15:11(Ostatnia zmiana: 2019-03-06, 20:50)
dzięki  za wyjaśnienie.
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator

Splash
Moderator

Ikarus (Pakiet skryptów)
#1008 2019-03-02, 17:51(Ostatnia zmiana: 2019-03-04, 14:43)
Przypomniałem sobie, że na niemieckim forum był temat poruszający możliwość otrzymania wszystkich przedmiotów w grze, bez konieczności ręcznego wpisywania instancji każdego z nich. Nie wiem czy problem udało im się rozwiązać, bo nie mogę go znaleźć, dlatego z nudów sam naskrobałem taki skrypt. Całuję rączki @inż. Avallach za jego temacik o symbolach parsera. Być może komuś się przyda do testowania moda.

func void CreateAllItems(var c_npc slf) {
    var int i;

    repeat(i, MEM_Parser.symtab_table_numInArray);
        var zCPar_Symbol symb; symb = _^(MEM_ReadIntArray(MEM_Parser.symtab_table_array, i));

        if ((symb.bitfield & zCPar_Symbol_bitfield_type) != zPAR_TYPE_INSTANCE || STR_IndexOf(symb.name, ".") > 0 || !symb.parent) {
            continue;
        };

        symb = _^(symb.parent);

        if (Hlp_StrCmp(symb.name, "C_ITEM")) {
            CreateInvItems(slf, i, 1);
        }
        else if (symb.parent && (symb.bitfield & zCPar_Symbol_bitfield_type) == zPAR_TYPE_PROTOTYPE) {
            symb = _^(symb.parent);

            if (Hlp_StrCmp(symb.name, "C_ITEM")) {
                CreateInvItems(slf, i, 1);
            };
        };
    end;
};

W skrócie: skrypt przeszukuje całą tablicę symboli parsera i szuka w niej przedmiotów.
Ostrzegam, że użycie tego skryptu może zwiesić na moment grę, ponieważ wykonywane jest wtedy kilkadziesiąt tysięcy zapętleń.

Edit: Uporządkowałem skrypt.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy

pawbuj

Ikarus (Pakiet skryptów)
#1009 2019-03-02, 21:03(Ostatnia zmiana: 2019-03-02, 21:16)
Moje rozwiązanie jest następujące. Co prawda odnalezienie nazwy klucza jest łopatologiczne, ale jest ich kilka w użyciu.

var int symbID;
  var string text;
  var string name;
 
  func void check_keyname()
  {
  if (symbID == ITKE_GOMEZ_01)       
    {
    text = ConcatStrings ("Użyłeś ",itke_gomez_01.name);Print (text);
    };
    if (symbID == ItKe_Storage_01)       
    {
    text = ConcatStrings ("Użyłeś ",ItKe_Storage_01.name);Print (text);   
    };
    if (symbID == itkey_ob_smith_01)       
    {
    text = ConcatStrings ("Użyłeś ",itkey_ob_smith_01.name);Print (text);
    };
    if (symbID == ITKE_TOWER_01)       
    {
    text = ConcatStrings ("Użyłeś ",ITKE_TOWER_01.name);Print (text);                 
     };   
  };
 
func int NEED_DOOR_KEY()//many thanks for Fawkes
        {
        var oCNpc her; her = Hlp_GetNpc(hero);         
           var oCMobLockable Door2; Door2 = _^(her.focus_vob);         
           

           Print(Door2.keyInstance);
           
                     
        if (Hlp_Is_oCMobLockable(her.focus_vob))
           {     
           symbID = MEM_GetSymbolIndex (Door2.keyInstance);
                           
        if (symbID > 0) && (symbID < currSymbolTableLength)
            {
            if (NPC_HasItems (hero, symbID))
            {
           
        Snd_Play ("Door_unlock");
        check_keyname();
        return TRUE;   
        }
        else if //(Str_len (Door2.keyInstance) > 0)&&
        (!Npc_HasItems(hero, symbID))
        {
        //
        AI_PlayAni(hero,"T_DONTKNOW");
        //AI_OutputSVM(hero,hero,"$NeedKey");
        AI_OutputSVM(hero,hero,"$keymissing");
        //AI_OutputSVM(hero,hero,"$neveropen");
       
        return FALSE;
        };
         };   
    };       
  };
 

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Nie lepiej po prostu tak?

var int symbID; symbID = MEM_GetSymbolIndex(Door2.keyInstance);

if (Npc_HasItems(hero, symbID)) {
    Npc_GetInvItem(hero, symbID);
    Print(ConcatStrings("Użyłeś ", item.name));
};
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

pawbuj

pawbuj

Użytkownicy
posty1623
Propsy135
ProfesjaSkrypter
  • Użytkownicy
Nie lepiej po prostu tak?

var int symbID; symbID = MEM_GetSymbolIndex(Door2.keyInstance);

if (Npc_HasItems(hero, symbID)) {
    Npc_GetInvItem(hero, symbID);
    Print(ConcatStrings("Użyłeś ", item.name));
};

@Splash  tylko nie bardzo wiem w jaki sposób symbID koreposponduje z item.name.  Czegoś jeszcze brakuje.
 

bogu9821

bogu9821

Użytkownicy
posty404
Propsy185
ProfesjaProgramista
  • Użytkownicy
 Latarnia twojego intelektu nie świeci zbyt jasno, co? @pawbuj   :ayfkm: :fuckyeah: :facepalm: :F :/
 
while(false) Do();

Cruc

Cruc

Użytkownicy
posty666
Propsy232
Profesjabrak
  • Użytkownicy
Czego Ci tu konkretnie brakuje?
 
while (!success) try{...}

Najlepszy modder od gothic multiplayer - polecam pytać go o wszystko!

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
@Splash  tylko nie bardzo wiem w jaki sposób symbID koreposponduje z item.name.  Czegoś jeszcze brakuje.
Bo nie "koresponduje" i niczego nie brakuje. Słowo na dzisiaj: dedukcja.
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

inż. Avallach

inż. Avallach

Administrator
posty7662
Propsy5238
NagrodyV
ProfesjaProgramista
  • Administrator
Pytanie Pawbuja wydaje mi się jak najbardziej na miejscu. Klucz w tym żeby wiedzieć że w Daedalusie funkcja nie może zwrócić obiektu, więc zamiast tego przypisuje do globalnej zmiennej.
Npc_GetInvItem(..., symbID);
...item.name...;
Oznacza to samo co w innym języku wyglądałoby tak:
var item = Npc_GetInvItem(..., symbID);
...item.name...;
Teraz już związek między symbID a item powinien być jasny :P

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
SystemPack do G1 nie ma opcji wyłączenia animacji podnoszenia, więc jeśli ktoś potrzebuje i nie chce grzebać w MDSie:
MemoryProtectionOverride(7002849, 5);
MEM_WriteByte(7002849, 0);
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

Splash

Splash

Moderator
posty4207
Propsy3403
ProfesjaNierób
  • Moderator
Zmiana ekranu ładowania w G1:

const int LOADINGTEXNAME_OFFSET = 8687516; //0x848F9C;

func void SetLoadTexName (var string texName) {
/*Länge ermitteln und prüfen ob passend */
var int len; len = STR_Len (texName);

if (len < 5) {
MEM_Error ("SetLoadTexName: texName too short. Empty or forgotten '.tga' extension?");
return;
} else if (len > 11) { //11 == STR_Len ("loading.tga");
MEM_Error ("SetLoadTexName: texName is too long. Truncate it to 11 chars (including '.tga' extension)!");
return;
};

/* Daten kopieren */
var int sPtr; sPtr = STRINT_ToChar (texName);
MEM_CopyBytes (sPtr, LOADINGTEXNAME_OFFSET, len);

/*  Nullbyte anhängen */
//MEM_WriteByte (LOADINGTEXNAME_OFFSET + len, 0);
MEM_WriteInt (LOADINGTEXNAME_OFFSET + len, MEM_ReadInt (LOADINGTEXNAME_OFFSET + len) & ~ 255);
};

Oryginalny skrypt:
https://forum.worldofplayers.de/forum/threads/790720-Scriptpaket-Zugriff-auf-ZenGine-Objekte/page19?p=13842523#post13842523
 
Nie zajmuję się multiplayerami do Gothica. Przestańcie zawracać mi tym głowę...
Ps. Siemekk ma downa i śpi w pufie

bogu9821

bogu9821

Użytkownicy
posty404
Propsy185
ProfesjaProgramista
  • Użytkownicy
Zniesienie limitu noszonych itemów w eq (w g2 na pewno 1024 to max, w g1 zależy od kategorii).

G1:
/*const int INV_COMBAT_MAX_addr = 8244652;

const int INV_ARMOR_MAX_addr = 8244656;

const int INV_RUNE_MAX_addr = 8244660;

const int INV_MAGIC_MAX_addr = 8244664;

const int INV_FOOD_MAX_addr = 8244668;

const int INV_DOCS_MAX_addr = 8244672;

const int INV_POTION_MAX_addr = 8244676;

const int INV_MISC_MAX_addr = 8244680;*/

var int addr;
var int i; repeat(i,8);
    addr = 8244652+(4*i);
    MemoryProtectionOverride(addr, 4);
    MEM_WriteInt(addr,0);
end;
G2:
const int INV_MAX_ITEMS_addr = 8635508;
MemoryProtectionOverride(INV_MAX_ITEMS_addr, 4);
MEM_WriteInt(INV_MAX_ITEMS_addr,0);

EDIT: zamieniłem w g1 8244652+i na 8244652+(4*i). Zapomniałem wcześniej o mnożeniu.
 
while(false) Do();

Mark56

Mark56

Moderator
som veľký magič
posty1632
Propsy1846
ProfesjaAnimator
  • Moderator
  • som veľký magič
Jaki to daje efekt ? Zmienia to tez UI ?
 



0 użytkowników i 2 gości przegląda ten wątek.
0 użytkowników
Do góry