Dwa razy plugin_precache
Najlepsza odpowiedź
DarkGL
04.12.2014 06:50

grankee
03.12.2014
Czy jest możliwość zdublowania plugin_precache()?
Oczywiście pytam, bo wprost tego zrobić nie można, kompilator się pluje.
chodzi mi o to, że robię np. plik nagłówkowy z funkcjami, ale niektóre wymagają precachowania, chcę więc dać to w nagłówku, ale w ten sposób zablokuje możliwość użycia tej funkcji drugi raz w pluginie. Z drugiej strony nie chcę obciążać użytkownika tej funkcji obowiązkiem precachowania ręcznie.
Oczywiście wiem, że mogę zrobić osobny plugin z natywami + inc do niego, ale jeśli jest możliwość to chcę się ograniczyć do samego inc.
sebul
03.12.2014
wiwi249
03.12.2014
Zrób sobie funkcje w pliku nagłówkowym:
stock PobierzPliki() { precache_generic("...."); }
I teraz w pluginie, w którym to używasz
public plugin_precache() { precache_model("jakiśtammodel.mdl"); PobierzPliki() }
grankee
03.12.2014
Chodzi dokładnie o to, żebym korzystając z .inc mógl po prostu użyć plugin_precache() i nic tam nie dodawać, nie troszczyć się żeby w tej funkcji coś było.
^Szeregowy^
03.12.2014

new Pliki[][] = { "model", "model", "model1", "model2", "model3", "model4"
proszę jesli zrobilem zle nie minusujcie mnie
Użytkownik GwynBleidD edytował ten post 04.12.2014 10:41
^Szeregowy^
03.12.2014

precache_files(szFilename[],type) { new szText[256], szKey[64], szValue[64] new a, pos = 0 new ent if (file_exists(szFilename)) { //server_cmd("echo [AMX] Start precaching from file '%s'",szFilename) while (read_file(szFilename,pos++,szText,sizeof(szText),a)) { if ( szText[0] == ';' ) continue if ( szText[0] == '/' && szText[1] == '/' ) continue if (equal(szText,"")) continue if (parse(szText, szKey, sizeof(szKey), szValue, sizeof(szValue)) >= 1) { if (type == 0) { if (equali(szKey,"precache_sound")) { precache_sound(szValue) server_cmd("echo [AMX] Sound '%s' precached",szValue) } else if (equali(szKey,"precache_model")) { precache_model(szValue) server_cmd("echo [AMX] Model '%s' precached",szValue) } else if (equali(szKey,"precache_generic")) { precache_generic(szValue) server_cmd("echo [AMX] Generic '%s' precached",szValue) } else if (equali(szKey,"load_file")) { precache_files(szValue,type) } } else { if (equali(szKey,"precache_class")) { ent = CreateEntity(szValue) if (ent) { DispatchSpawn(ent) RemoveEntity(ent) server_cmd("echo [AMX] Class '%s' precached",szValue) } else { server_cmd("echo [AMX] Error in precaching class %s",szValue) } } else if (equali(szKey,"load_file")) { precache_files(szValue,type) } } } } } } public plugin_precache() { new map[64] get_mapname(map,sizeof(map)) new t1[128],t2[128] #if defined _amxmodx_included format(t1,sizeof(t1),"addons/amxx/precache/default.pre") format(t2,sizeof(t2),"addons/amxx/precache/%s.pre",map) #else format(t1,sizeof(t1),"addons/amx/precache/default.pre") format(t2,sizeof(t2),"addons/amx/precache/%s.pre",map) #endif precache_files(t1,0) precache_files(t2,0) return PLUGIN_CONTINUE } public plugin_init() { register_plugin(Title,Version,Author) new map[64] get_mapname(map,sizeof(map)) new t1[128],t2[128] #if defined _amxmodx_included format(t1,sizeof(t1),"addons/amxx/precache/default.pre") format(t2,sizeof(t2),"addons/amxx/precache/%s.pre",map) #else format(t1,sizeof(t1),"addons/amx/precache/default.pre") format(t2,sizeof(t2),"addons/amx/precache/%s.pre",map) #endif precache_files(t1,1) precache_files(t2,1) return PLUGIN_CONTINUE }
Użytkownik GwynBleidD edytował ten post 04.12.2014 10:43
^Szeregowy^
03.12.2014
Wpadłem na jeszcze 1 pomysł moim zdaniem najlepszy pobieranie z pliku.ini
/* * AMXMODX script * simple precaching script * depends on amxmodx/configs/precache.ini */ #include <amxmodx> #include <engine> #include <amxmisc> public plugin_init() { register_plugin("precache", "1.0", "Nie Znajomy :)") } public plugin_precache() { new conffile[200] new configdir[200] get_configsdir(configdir,199) format(conffile,199,"%s/precache.ini",configdir) if(!file_exists(conffile)) { log_amx("amxmodx/configs/precache.ini is missing!") return 0 } new lines = file_size(conffile,1) new file[1024], len for(new i=0;i<=lines;i++) { read_file(conffile,i,file,1023,len) if(equal(file,"")) continue; if(!equal(file,";",1)) precache_generic(file); } return PLUGIN_HANDLED }
Plik ten uzupełniamy nazwami(wraz z folderami) potrzebnych plików, po jednym w linijce.
sound/misc/sound.wav sound/misc/sound.wav models/model/model.mdl
Jeżeli chcemy wyłączyć pobieranie któregoś pliku to stawiamy średnik ";" jako pierwszy znak w linijce:
sound/misc/sound.wav ;sound/misc/sound.wav <= ten dźwięk jest wyłączony models/model/model.mdl
itp

Użytkownik GwynBleidD edytował ten post 04.12.2014 10:49
^Szeregowy^
04.12.2014
chcesz do pliku.inc dodac funkcje na podwojne pobieranie z plugin_precache ?
grankee
04.12.2014
Nie, chcę w pliku .inc precachować pliki
public plugin_precache() { //precache cośtam }
ale jednoczeście po zaincludowaniu tegoż inc chcę mieć możliwość użycia funkcji plugin_precache() w kodzie. Wiadomo, że dwa razy nie można (w inc a pozniej w kodzie) bo kompilator nie lubi deja vu, ale może da się jakoś to obejść. Aha i w kodzie może użyję plugin_precache a może nie, a jak użyję to nie chcę musiec dodawac jakiejs funkcji.
Najlepsza odpowiedź
DarkGL
04.12.2014
GwynBleidD
04.12.2014
Rozwinę to, co darkgl napisał: w include tworzysz normalnie plugin_precache, a na jego końcu (lub początku, jeśli wolisz) wykonujesz dowolną funkcję poprzez callfunc (aby nie wysypywało błędów, gdy funkcja nie istnieje). Poniżej plugin_precache w include aliasujesz plugin_precache na swoją funkcję, dzięki czemu w kodzie w pluginie znów możesz użyć plugin_precache. Sposób dość sprytny
grankee
04.12.2014
Oo Darku nie widziałem, że takie rzeczy się da Dzięki wielkie, dokładnie o to chodziło.
@Gwyn- zrozumiałem po przeczytaniu jego inc, ale dzięki wielkie za chęci