Cóż, aktywny modding zacząłem rzeczywiście dość niedawno. Na jednej ze starszych wersji pod IPB (pamiętam siatkę modelu orka w headerze) byłem pod innym nickiem ale nieaktywny. Nie zależy mi na jakiejś pozycji w rankingu, ale wydaje mi się że jednak jeśli chodzi o poziom zaawansowania jestem dość wysoko - z całą pewnością za Orcwarriorem, nie mam pojęcia czym "ambitnym" zajmował się Zysk, pomysły Fenixa z MT z całą pewnością były dość przełomowe, ale wydaje mi się że potrafiłbym (przynajmniej obecnie) coś podobnego stworzyć. Ogólnie najczęściej pomagam ludziom na gg, na forum raczej na pw niż w jawnych tematach (co sporo osób mogłoby potwierdzić). Wynika to po części z niechęci do tłumaczenia bardziej zaawansowanych zagadnień ludziom którzy nie ogarniają podstaw. Główny argument przemawiający na moją niekorzyść to to że żadne z moich bardziej ambitnych "odkryć" nigdy nie zostało ukończone ani zaprezentowane. Przykładem jest tu choćby coś takiego:
Spoiler
//////////////////////////////////////////////////////////
// Avallach - Engine Objects Access Tool //
// Script version 0.1 [usage at your own risk] //
// Gothic I version 1.08k //
// ZenGin v1.00 - 1997-2001 Mad Scientists //
//////////////////////////////////////////////////////////
class _av_eoat {};
var _av_eoat _av_eoat_object;
var oCNpc _av_eoat_oCNpc;
//////////////////////////////////////////////////
func int _av_eoat_PushInt(var int value) { return value + 0; };
func _av_eoat _av_eoat_poppointer () {};
func void _av_eoat_emergency_return () { _av_eoat_PushInt(_av_eoat_object); var _av_eoat token; token = _av_eoat_poppointer(); };
//////////////////////////////////////////////////
instance _av_eoat_npc (c_npc)
{
id = 1 << 7;
flags = 1 << 1;
attribute[0] = 1;
attribute[1] = 1;
wp = "PC_HERO";
Daily_Routine = _av_eoat_rtn;
CreateInvItem (self, ItMi_Stuff_OldCoin_02);
//Mdl_SetVisual (self, "meatbug.mds");
_av_eoat_ocnpc = Hlp_GetNpc(self);
};
func void _av_eoat_rtn()
{ TA_Position(00,00,12,00,self.wp); TA_Position(12,00,00,00,self.wp); };
//////////////////////////////////////////////////
func _av_eoat _av_eoat_GetObject (var int address)
{
if (!Hlp_IsValidNpc (_av_eoat_ocnpc) || Wld_DetectNpc (hero, _av_eoat_ocnpc, NOFUNC, -1))
{ Wld_RemoveNpc(_av_eoat_npc); Wld_InsertNpc (_av_eoat_npc, _av_eoat_npc.wp); };
_av_eoat_ocnpc = Hlp_GetNpc (_av_eoat_npc);
_av_eoat_oCNpc.enemy = adress - 256;
_av_eoat_object = Npc_GetTarget(_av_eoat_ocnpc);
return _av_eoat_object; _av_eoat_emergency_return ();
};
//////////////////////////////////////////////////
func void _av_eoat_test ()
{
var oCGame oGame;
oGame = _av_eoat_GetObject(9283260); oGame.game_showwaynet = 1;
};
Zacząłem to pisać jeszcze na długo zanim ukazała się pierwsza wersja Ikarusa, niedługo po tym jak NicoDE po udostępnieniu definicji wcześniej niedostępnych klas enginowych jako pierwszy dał pomysł wykorzystania luki w funkcji Npc_GetTarget, jednak szybko porzuciłem prace ze względu na zajęcie się grafiką 3d i problem z offsetami.
Nie był to może skrypt ambitny czy odkrywczy w skali Orca czy pewnie Zyska i Fenixa, jednak gdyby działał to byłbym z niego całkiem zadowolony...
//edit: jak tak patrzę na ten skrypt, to w sumie ma trochę niepotrzebnych rzeczy. No i nie zaprzeczam że w sumie w całości opiera się na pomyśle wymienienego NicoDE, nie roszczę sobie do niego żadnych praw. Nigdy nawet nie miał być publicznie pokazywany
Tutaj także bardzo stare, wygrzebane z tajniaka NT "dokonania". Chciałbym zaznaczyć że np w efektach mieczy inaczej niż w powszechnie znanej sposobie nie używałem nigdy triggerów.
http://ifotos.pl/img/Beztytulu_xeqxwq.jpgJak słusznie nazwał Yubasek, wynalazłem na nowo koło pisząc taki skrypt (wiedziałem że coś takiego w programowaniu oczywiście istnieje, ale nie byłem pewien jak dokładnie działa a że potrzebowałem kiedyś czegoś takiego do Gothica to "wymyśliłem" i napisałem według tego nie wiem czy dobrze opracowanego pomysłu:
Spoiler
func int _avse_it_special_verify (item_id, special_flag)
{
special_flag_next = special_flag * 2;
if (item_id >= special_flag_next)
{
item_id = item_id - special_flag_next;
return _avse_it_special_verify(item_id, special_flag);
}
else if (item_id >= special_flag)
{
return 1;
}
else
{
return 0;
};
};
Funkcja jest bardzo prosta, czyta wartości kolejnych bitów liczby, ale pewnie nie każdy Gothicowy skrypter by to zrobił czy znalazł zastosowanie (ona także jest bardzo stara i nigdy nie była testowana ;))
Robiłem też duale przy których z punktu widzenia gracza nie było podziału na miecz prawo i lewo ręczny. Stanęło na tym że brakowało funkcji rozróżniającej czy poprzednia broń została ściągnięta "ręcznie" czy przez "nadpisanie" jej założeniem nowej. Jednak chyba dość skutecznie można było to załatwić mierząc czas pomiędzy ściągnięciem poprzedniej a założeniem nowej. Tego także nie dokończyłem przez brak czasu.