Witam, czy da się pobrać ID broni, która leży na mapie? Chodzi mi oczywiście o bronie, które automatycznie dodaje mapa.
Pozdrawiam
Witamy w Nieoficjalnym polskim support'cie AMX Mod X, jak w większości społeczności internetowych musisz się zarejestrować aby móc odpowiadać lub zakładać nowe tematy, ale nie bój się to jest prosty proces w którym wymagamy minimalnych informacji.
|
Napisano 15.07.2014 23:15
Witam, czy da się pobrać ID broni, która leży na mapie? Chodzi mi oczywiście o bronie, które automatycznie dodaje mapa.
Pozdrawiam
Mam do sprzedania pluginy AMXX pod serwery typu, JB, ONLY DD2, ZOMBIE, COD MOD, DR i inne...
Jeżeli jesteś zainteresowany(a), napisz na PW lub GG 42384104
Napisano 15.07.2014 23:17
Rozumiem że chcesz w formacie CSW_*?
Bezpośrednio prawdopodobnie się nie da, ale zawsze po modelu można dojść co to za broń
EDIT: A jest jednak gotowa funkcja o nazwie cs_get_weapon_id która powinna Ci pomóc
Użytkownik Puchate edytował ten post 15.07.2014 23:19
Napisano 15.07.2014 23:22
OK, sprawdzę, chociaż nie jestem do tego przekonany.
Mam do sprzedania pluginy AMXX pod serwery typu, JB, ONLY DD2, ZOMBIE, COD MOD, DR i inne...
Jeżeli jesteś zainteresowany(a), napisz na PW lub GG 42384104
Napisano 15.07.2014 23:24
Dlaczego? Jest to funkcja z modułu cstrike, musisz jej podać tylko identyfikator entity leżącej broni a zostanie zwrócony Ci jej index w formacie CSW_*.
Napisano 15.07.2014 23:29
Dlaczego? Jest to funkcja z modułu cstrike, musisz jej podać tylko identyfikator entity leżącej broni a zostanie zwrócony Ci jej index w formacie CSW_*.
Kombinowałem i nie nie mogę wymyślić jak to wykorzystać. Bo chciał bym, że np. po wpisaniu komendy /id zaznaczoną broń i w czacie napisało ID broni.
Mam do sprzedania pluginy AMXX pod serwery typu, JB, ONLY DD2, ZOMBIE, COD MOD, DR i inne...
Jeżeli jesteś zainteresowany(a), napisz na PW lub GG 42384104
Napisano 16.07.2014 00:08
register_touch("weaponbox", "player", "DotkniecieBroni"); (..) static szModel[64], trash[2]; entity_get_string(went, EV_SZ_model, szModel, 63); replace(szModel, 63, "w_", " "); replace(szModel, 63, ".mdl", ""); strbreak(szModel, trash, 1, szModel, 63); format(szModel, 63, "weapon_%s", szModel); if(equal(szModel, "weapon_mp5")) format(szModel, 63, "%snavy", szModel); static weaponid; weaponid = get_weaponid(szModel);Chociażby tak. Można też kombinować i poszukać gdzieś w offsetach pdata czy "weaponbox" nie przechowuje gdzieś id broni.
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Napisano 16.07.2014 00:12
//W plugin_init RegisterHam(Ham_Touch,"weaponbox","TouchWeaponbox",0) //Łapię event dotnięcia weaponbox'a // const m_iId = 43 const m_pNext = 42 stock const m_rgpPlayerItems_CWeaponBox[6] = { 34 , 35 , ... } public TouchWeaponbox(WeaponBox,id) { if(pev_valid(WeaponBox) != 2 || !is_user_alive(id)) return HAM_IGNORED //Zatrzymuje jeśli WeaponBox nie przechowuje pdata lub byt który go dotnął to nie żywy gracz new wid,classname[32],weapon for(new i;i<6;++i) //Aby pobrać bronie w weaponboxie trzeba przelecieć po wszystkich slotach i zobaczyć jaką broń ma { //Sloty są zbudowane tak jak u gracza dlatego jakichś nowości nie ma if(pev_valid((wid = get_pdata_cbase(WeaponBox,m_rgpPlayerItems_CWeaponBox[i],4))) != 2) continue // Pobieram id bytu pierwszej broni w danym slocie. Jeśli w danym slocie nie ma broni to ide do kolejnego do //Robie pętlę która wykona się przynajmniej raz { //Piękne zastosowanie rzadko używanej pętli xD weapon = get_pdata_int(wid,m_iId,4) //Pobieram id z CSW_* dla danej broni get_weaponname(weapon,classname,31) //Pobieram classname danej broni client_print(id,print_chat,"W weapon boxie znajduje sie bron o indexie %i i classname %s",weapon,classname) //Wyświetlam zawartość } while(pev_valid((wid = get_pdata_cbase(wid,m_pNext,4))) == 2) //Pętla będzie się kręcić dopóki na danym slocie będą bronie } return HAM_IGNORED }Lecz jeśli chcesz np. sprawdzić czy w weaponbox'ie jest awp to tak jest szybciej:
//W plugin_init RegisterHam(Ham_Touch,"weaponbox","TouchWeaponbox",0) //Łapię event dotnięcia weaponbox'a // const m_iId = 43 const m_pNext = 42 stock const m_rgpPlayerItems_CWeaponBox[6] = { 34 , 35 , ... } public TouchWeaponbox(WeaponBox,id) { if(pev_valid(WeaponBox) != 2 || !is_user_alive(id)) return HAM_IGNORED new wid if(pev_valid((wid = get_pdata_cbase(WeaponBox,35,4))) == 2) { do { if(get_pdata_int(wid,m_iId,4) == CSW_AWP) goto jump } while(pev_valid((wid = get_pdata_cbase(wid,m_pNext,4))) == 2) return HAM_IGNORED } jump: //Jee w weapon boxie jest awp // w tym miejscu możesz umieścić swój kod xD //Krótki opis // • pev_valid(WeaponBox) != 2 - sprawdzam czy weaponbox przechowuje dane pdata // • !is_user_alive(id) - sprawdzam czy dotnął go żywy gracz // • pev_valid((wid = get_pdata_cbase(WeaponBox,35,4))) == 2 - pobieram id bytu broni ze slotu nr. 1 (bo w nim jest awp (tzn. primary weapon to jest, pistolety są w drugim, noz jest w trzecim itd)) i sprawdzam czy ten byt posiada dane pdata // // Następnie przejeżdżam po wszystkich broniach w slocie nr.2 i sprawdzam czy któraś to awp jeśli tak to skacze do etykiety jump jeśli dana broń to awp return HAM_IGNORED }Osobiście bardzo nie lubie operować na stringach (jako danych, no chyba że Trie bo to dosyć szybkie ) dlatego zawsze używam tego kodu do zabawy nad weaponbox'em
Napisano 16.07.2014 01:49
Jeżeli interesują Cię tylko bronie główne i pistolety to zobacz to:
/* Plugin generated by AMXX-Studio */ #include <amxmodx> #include <hamsandwich> #include <cstrike> #include <fakemeta> #define PLUGIN "New Plug-In" #define VERSION "1.0" #define AUTHOR "Młody" #define weaponBoxOffset 4 public plugin_init() { register_plugin(PLUGIN, VERSION, AUTHOR) RegisterHam(Ham_Touch, "weaponbox", "weaponBox_Touch") } public weaponBox_Touch(weaponBox, id) { if(!is_user_alive(id) || pev(weaponBox, pev_flags) ^ FL_ONGROUND) return new weapon = get_weaponbox_name(weaponBox) client_print(0, 3, "Touched weapon on ground: %d", weapon) } stock get_weaponbox_name(weaponBox) { new weapon for(new i = 35; i <= 36; i++) { weapon = get_pdata_cbase(weaponBox, i, weaponBoxOffset) if(weapon > 0) return cs_get_weapon_id(weapon) } return 0 }
Przy testowaniu zważ na to że touch na weaponbox działa dość dziwnie
Napisano 16.07.2014 06:34
Jeżeli interesują Cię tylko bronie główne i pistolety to zobacz to:
Puchate to jest dokładnie to samo co ja napisałem... Dodatkowo ma wade bo pobiera tylko pierwszą broń w danym slocie a trzeba pamiętać iz w weaponbox'ie może być więcej broni na danym slocie (nawet 29)
Dodatkowo powiem że moduł hamsandwich w ostatniej aktualizacji dodał ciekawa funkcję do cs'a:
Ham_CS_Player_OnTouchingWeapon nie sprawdzałem jej ale powinna się wykonywac podczas dotknięcia broni przez gracza Więcej informacji znajdziesz tutaj: klik linia 1716
Napisano 16.07.2014 10:45
//W plugin_init RegisterHam(Ham_Touch,"weaponbox","TouchWeaponbox",0) //Łapię event dotnięcia weaponbox'a // const m_iId = 43 const m_pNext = 42 stock const m_rgpPlayerItems_CWeaponBox[6] = { 34 , 35 , ... } public TouchWeaponbox(WeaponBox,id) { if(pev_valid(WeaponBox) != 2 || !is_user_alive(id)) return HAM_IGNORED new wid if(pev_valid((wid = get_pdata_cbase(WeaponBox,35,4))) == 2) { do { if(get_pdata_int(wid,m_iId,4) == CSW_AWP) { doAwpStuff(WeaponBox, id, wid) return HAM_IGNORED } } while(pev_valid((wid = get_pdata_cbase(wid,m_pNext,4))) == 2) } return HAM_IGNORED } doAwpStuff(WeaponBox, id, wid) { //Jee w weapon boxie jest awp // w tym miejscu możesz umieścić swój kod xD //Krótki opis // • pev_valid(WeaponBox) != 2 - sprawdzam czy weaponbox przechowuje dane pdata // • !is_user_alive(id) - sprawdzam czy dotnął go żywy gracz // • pev_valid((wid = get_pdata_cbase(WeaponBox,35,4))) == 2 - pobieram id bytu broni ze slotu nr. 1 (bo w nim jest awp (tzn. primary weapon to jest, pistolety są w drugim, noz jest w trzecim itd)) i sprawdzam czy ten byt posiada dane pdata // // Następnie przejeżdżam po wszystkich broniach w slocie nr.2 i sprawdzam czy któraś to awp jeśli tak to WYKONUJĘ FUNKCJĘ, ŻADNYCH JUMPÓW!!! }Prawda, że ładniej?
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Napisano 16.07.2014 11:19
Kto używa goto i po co?!
Ja go czasem używam bo się niekiedy przydaje. Jak np. nie chcesz robić 21893712 funkcji to po to są te jump'y. Używam go tylko w pętlach bo inaczej nie ma najmniejszego sensu ale w pętlach naprawdę się przydaje
Tylko zaciemnia kod i potrafi spowodować naprawdę niemiłe błędy....
Jeśli się rozumi jego działanie to nie powinno niczego "zaciemniać" i jedynie błędne stosowanie powoduje błędy
Bardzo dużo ludzi twierdzi że instrukcja
goto
jest "belką w oczach" programisty ależ to nie prawda naprawdę bardzo się przydaje bo po co tworzyć ileś tam funkcji które używamy tylko raz w kodzie? (Pamiętajmy że główne założenia funkcji mówią o tym iż powinno robić się nowe funkcje tylko wtedy gdy chce się z nich wiele razy korzystać bo jeśli chcemy tylko raz to wystarczy sam kod funkcji skopiować i przekleić do innej funkcji) Po to jest właśnie ta instrukcja by sobie łatwo skoczyć poza tym za pomocą tej instrukcji bardzo łątwo się przemieścić w wykonywanym kodzie (w danej funkcji). To coś takiego co daje dużą mobilność ale ja rozumiem większośc programistów zawsze pisze swój kod by szedł z lini do lini w dół (w danej funkcji) a czemu nie skakać jak się nam żywnie podoba (ale tylko o uzasadnione i racjonalne skoki mi chodzi)?
Jeśli nadal uważasz że niepoprawnym jest używanie tej instrukcji to podaj przykład (na pw bo nie od tego jest ten temat) jak zrobić (w jednej funkcji + bez dodatkowych zmiennych) funkcje z tego tematu http://amxx.pl/topic...zanie-broniami/ bodajże GetUserAmmo
Ale co do tego przypadku to nie ma najmniejszej różnicy czy użyje się goto czy nowej funkcji (której pewnie użyjemy tylko raz w kodzie!!). Kod i tak, i tak zadziała.
Napisano 16.07.2014 11:32
Chodziło mi dokładnie, o zaznaczenie broni która leży na ziemi, zapisanie jej ID, zapisanie do zapisu i usuwania np. od początku rundy. Wiecie o co chodzi? I mam tylko problem z zaznaczeniem tej broni i pobraniem ID. Czy to co wyżej dodaliście na pewno spełni moje wymagania?
Mam do sprzedania pluginy AMXX pod serwery typu, JB, ONLY DD2, ZOMBIE, COD MOD, DR i inne...
Jeżeli jesteś zainteresowany(a), napisz na PW lub GG 42384104
Napisano 16.07.2014 11:33
TakCzy to co wyżej dodaliście na pewno spełni moje wymagania?
pev(weaponBox, pev_flags) ^ FL_ONGROUNDjeśli już tak bardzo chcemy używaź XOR'a powinno wygladać tak:
(pev(weaponBox, pev_flags) & FL_ONGROUND) ^ FL_ONGROUNDale i tak lepiej sprawdzić tak:
~pev(weaponBox, pev_flags) & FL_ONGROUNDBo inaczej nie funkcja się zatrzyma z powodu posiadania jakiejś innej flagi której nie sprawdzasz
Użytkownik BlackPerfum edytował ten post 16.07.2014 11:38
Napisano 16.07.2014 11:36
Jak tak nowa funkcja nie pasuje, to można próbować też takAle co do tego przypadku to nie ma najmniejszej różnicy czy użyje się goto czy nowej funkcji (której pewnie użyjemy tylko raz w kodzie!!). Kod i tak, i tak zadziała.
public TouchWeaponbox(WeaponBox,id) { if(pev_valid(WeaponBox) != 2 || !is_user_alive(id)) return HAM_IGNORED new wid if(pev_valid((wid = get_pdata_cbase(WeaponBox,35,4))) == 2) { do { if(get_pdata_int(wid,m_iId,4) == CSW_AWP) break } while(pev_valid((wid = get_pdata_cbase(wid,m_pNext,4))) == 2) return HAM_IGNORED } if(!pev_valid(wid) || get_pdata_int(wid,m_iId,4) != CSW_AWP) return HAM_IGNORED //Jee w weapon boxie jest awp // w tym miejscu możesz umieścić swój kod xD //Krótki opis // • pev_valid(WeaponBox) != 2 - sprawdzam czy weaponbox przechowuje dane pdata // • !is_user_alive(id) - sprawdzam czy dotnął go żywy gracz // • pev_valid((wid = get_pdata_cbase(WeaponBox,35,4))) == 2 - pobieram id bytu broni ze slotu nr. 1 (bo w nim jest awp (tzn. primary weapon to jest, pistolety są w drugim, noz jest w trzecim itd)) i sprawdzam czy ten byt posiada dane pdata // // Następnie przejeżdżam po wszystkich broniach w slocie nr.2 i sprawdzam czy któraś to awp jeśli tak to skacze do etykiety jump jeśli dana broń to awp return HAM_IGNORED }A co do samego goto, jaką masz pewność, że ktoś zobaczywszy goto w kodzie, nie będzie tego używał nadmiernie i niepotrzebnie, bo ktoś tak napisał na farum?
Chcesz usuwać bronie leżące sobie gdzieś na mapie? To tutaj chyba id broni nie jest Ci potrzebne, bo nie usuwasz samej broni, a jej box (czy jako to nazwać), w której broń się znajduje.Chodziło mi dokładnie, o zaznaczenie broni która leży na ziemi, zapisanie jej ID, zapisanie do zapisu i usuwania np. od początku rundy. Wiecie o co chodzi? I mam tylko problem z zaznaczeniem tej broni i pobraniem ID. Czy to co wyżej dodaliście na pewno spełni moje wymagania?
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Napisano 16.07.2014 11:41
Okej, sprawdzę i dam znać.
Chcesz usuwać bronie leżące sobie gdzieś na mapie? To tutaj chyba id broni nie jest Ci potrzebne, bo nie usuwasz samej broni, a jej box (czy jako to nazwać), w której broń się znajduje.
No a przykładowo jak na mapie jest 10 broni AWP, i np. jedną z nich chce usunąć bo mi jest nie potrzeba itd. To potrzebuje tylko ID boxa w którym się broń znajduje ?
Mam do sprzedania pluginy AMXX pod serwery typu, JB, ONLY DD2, ZOMBIE, COD MOD, DR i inne...
Jeżeli jesteś zainteresowany(a), napisz na PW lub GG 42384104
Napisano 16.07.2014 11:45
Żadnej ale to tak samo jak: "jaką masz pewność, że ktoś zobaczywszy if w kodzie, nie będzie tego używał nadmiernie i niepotrzebnie, bo ktoś tak napisał na farum?"A co do samego goto, jaką masz pewność, że ktoś zobaczywszy goto w kodzie, nie będzie tego używał nadmiernie i niepotrzebnie, bo ktoś tak napisał na farum?
public TouchWeaponbox(WeaponBox,id) { if(pev_valid(WeaponBox) != 2 || !is_user_alive(id)) return HAM_IGNORED new wid if(pev_valid((wid = get_pdata_cbase(WeaponBox,35,4))) == 2) { do { if(get_pdata_int(wid,m_iId,4) == CSW_AWP) break } while(pev_valid((wid = get_pdata_cbase(wid,m_pNext,4))) == 2) return HAM_IGNORED // jesli nie używasz goto tego tu ma niebyć gdyż dalsza część funkcji się nie wykona... } if(!pev_valid(wid) || get_pdata_int(wid,m_iId,4) != CSW_AWP) return HAM_IGNORED //Dalszy kod return HAM_IGNORED }Przez to że nie użyłeś instrukcji goto musisz użyć instrukcji if oraz użyć niepotrzebnie dwóch funkcji:
if(!pev_valid(wid) || get_pdata_int(wid,m_iId,4) != CSW_AWP)Zazwyczaj jak piszę kod to staram się jak najbardziej go optymalizować (ale zarazem nie dopuszczać do błędów na granicy racjonalnych przypadków)
Napisano 16.07.2014 11:51
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Napisano 16.07.2014 12:01
Przez takie myslenie Java wypiera inne języki.. Wracając do tematu to czy ja komuś każę używac goto? Alez nie nie używajcie tego nikt wam nie każe nawet lepiej jesli ktoś tego nie rozumie to niech nie używa... Tylko nie czepiajcie się tego że ja używam. sebul wiesz dlaczegoZresztą "czytelność kodu > maksymalna optymalizacja".
? Powiedz mi jak często widzisz instrukcję if a jak często goto? if co chwile a goto prawie nigdy i właśnie przez to ludzie jej nie rozumieją a zarazem uważają że:Instrukcja if nie zaciemnia kodu, itp. tak jak to napisał gwyn, a goto możesz w taki sposób użyć, że tylko Ty sam będziesz wiedział co się dzieje w kodzie.
Tak zwane logiczne psychologiczne podejście do sprawy. Jak fajnie mieć psychologa w rodzinie (leczy mnie na weekend'y)Tylko zaciemnia kod i potrafi spowodować naprawdę niemiłe błędy....
Użytkownik BlackPerfum edytował ten post 16.07.2014 12:02
Napisano 16.07.2014 15:11
NIE pomagam na PW. Nie trudź się, na zlecenia nie odpiszę... Od pomagania jest forum.
NIE zaglądam w tematy wysłane na PW. Jeśli są na forum to prędzej czy później je przeczytam. Jeśli mam co w nich odpisać, to odpiszę.
Napisano 16.07.2014 16:01
1. Poprawne używanie goto jest dość trudne. Jest też ciężko zrozumieć jak do końca goto działa i jeśli mamy możliwość użycia innej, wcale nie gorszej metody, dobrze jest jej użyć.
Tak zasięg goto jest rzeczą trudną do zrozumienia (dokładnie to chodzi o zasięg zmiennych tworzonych podczas pętli lub pomiędzy użyciem goto a etykietą do której się skacze) lecz jeśli to się zrozumie ta instrukcja jest naprawdę ciekawa w użyciu i daje bardzo dużo możliwości. Niestety dla osób niedoświadczonych z jej użyciem powinna być tematem tabu lub po prostu zakazanym
2. W przypadku użycia goto w pętli, tak jak Ty to zrobiłeś, nie ma gwarancji na to, jaką wartość będzie miało wid (bo jego wartość jest wpisywana w warunku, który MOŻE się wykonać przy wychodzeniu z pętli używając goto). Takiej gwarancji nie ma większość języków programowania, zwłaszcza jeśli chodzi o pętle for i używany w niej licznik. Dlatego czasem goto może prowadzić do niezłych, niewyjaśnionych błędów, bo to jest tylko jeden związany kwiatek.
Tu się nie zgodzę bo wtedy nie było by odczuwalnej różnicy między break a goto gdyż pamiętajmy iż instrukcja goto została wprowadzona z myślą o przerywaniu WSZYSTKICH aktywnych pętli i skoku do danej sekcji kodu. Nie bez powodu ta instrukcja jest nazwana bezwarunkowym skokiem. Przyznaje podczas pętli używając goto tracimy dostęp do części zmiennych o krótszym zasięgu niż zasięg skoku ale trzeba pamiętać że to my ustalamy zasięg zmiennych i zasięg skoku dlatego (przynajmniej w przypadku mojej funkcji w poście wyżej) żadna zmienna (którą używam po skoku) nie zmieni wartości podczas skoku tzn. mam gwarancję na to że jesli skok się wykona to na 100% wid będzie przechowywać id bytu broni. Mogę się mylić lecz wątpię gdyż jeszcze nigdy nie zdażyło mi się by goto nawaliło
Dlaczego też twierdzę, że goto jest beznadziejne?
Jego największą wadą jest zrozumienie zasięgu zmiennych dlatego jest beznadziejne (wymuszona utrata danych...) ale jeśli się to zrozumie to wcale takie złe nie jest
Dla przykładu w pythonie pętla posiada else Kod w else wykona się, gdy pętla NIE zostanie przerwana instrukcją break.
Niestety w Pawnie czegoś takiego nie ma A mogli coś takiego zrobić...
0 użytkowników, 0 gości, 0 anonimowych