Skocz do zawartości

  • Zaloguj korzystając z Facebooka Zaloguj korzystając z Twittera Zaloguj przez Steam Zaloguj poprzez Google      Logowanie »   
  • Rejestracja

Witamy w Nieoficjalnym polskim support'cie AMX Mod X

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.

  • Rozpoczynaj nowe tematy i odpowiedaj na inne
  • Zapisz się do tematów i for, aby otrzymywać automatyczne uaktualnienia
  • Dodawaj wydarzenia do kalendarza społecznościowego
  • Stwórz swój własny profil i zdobywaj nowych znajomych
  • Zdobywaj nowe doświadczenia

Dołączona grafika Dołączona grafika

Guest Message by DevFuse
 

Zdjęcie

Pobranie ID broni leżacej na ziemi


  • Nie możesz napisać tematu
  • Zaloguj się, aby dodać odpowiedź
19 odpowiedzi w tym temacie

#1 Andrzejek

    Ucze się :]

  • Power User

Reputacja: 131
Zaawansowany

  • Postów:1300
  • GG:
  • Steam:steam
  • Imię:Andrzej
  • Lokalizacja:Wadowice
Offline

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


  • +
  • -
  • 0

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


#2 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 198
Profesjonalista

  • Postów:432
  • Lokalizacja:Polska
Offline

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 :P


Użytkownik Puchate edytował ten post 15.07.2014 23:19

  • +
  • -
  • 0

#3 Andrzejek

    Ucze się :]

  • Autor tematu
  • Power User

Reputacja: 131
Zaawansowany

  • Postów:1300
  • GG:
  • Steam:steam
  • Imię:Andrzej
  • Lokalizacja:Wadowice
Offline

Napisano 15.07.2014 23:22

OK, sprawdzę, chociaż nie jestem do tego przekonany.


  • +
  • -
  • 0

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


#4 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 198
Profesjonalista

  • Postów:432
  • Lokalizacja:Polska
Offline

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_*.


  • +
  • -
  • 0

#5 Andrzejek

    Ucze się :]

  • Autor tematu
  • Power User

Reputacja: 131
Zaawansowany

  • Postów:1300
  • GG:
  • Steam:steam
  • Imię:Andrzej
  • Lokalizacja:Wadowice
Offline

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.


  • +
  • -
  • 0

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


#6 sebul

    Godlike

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

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.
  • +
  • -
  • 0
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Generator tabeli expa - aż do 103600 poziomu

#7 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 16.07.2014 00:12

Jak widzisz leżącą na ziemi broń to tak naprawdę to nie jest broń a weaponbox w skomplikowany sposób ale da się z niego id wyciągnąć danej broni. Funkcja cs_get_weapon_id nie przyda ci się gdyż weaponbox to osobny byt sad.png

Jak przykładowy kod który łapie dotnięcie weapon_box'a i pobiera id i classname broni będących w nim (przed chwilą napisany) :
//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 haha.gif) dlatego zawsze używam tego kodu do zabawy nad weaponbox'em
  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#8 Puchate

    Wszechobecny

  • Użytkownik

Reputacja: 198
Profesjonalista

  • Postów:432
  • Lokalizacja:Polska
Offline

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 ;)


  • +
  • -
  • 0

#9 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

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 xD Więcej informacji znajdziesz tutaj: klik linia 1716


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#10 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 16.07.2014 10:45

Niee, 27920 tylko nie goto! Kto używa goto i po co?! Tylko zaciemnia kod i potrafi spowodować naprawdę niemiłe błędy....

//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?
  • +
  • -
  • 0
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ę.
 
1988650.png?theme=dark

#11 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

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 biggrin.png
 

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 biggrin.png

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.


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#12 Andrzejek

    Ucze się :]

  • Autor tematu
  • Power User

Reputacja: 131
Zaawansowany

  • Postów:1300
  • GG:
  • Steam:steam
  • Imię:Andrzej
  • Lokalizacja:Wadowice
Offline

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?


  • +
  • -
  • 0

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


#13 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 16.07.2014 11:33

Czy to co wyżej dodaliście na pewno spełni moje wymagania?

Tak
 
Tak poza tym to to:
pev(weaponBox, pev_flags) ^ FL_ONGROUND
jeśli już tak bardzo chcemy używaź XOR'a powinno wygladać tak:
(pev(weaponBox, pev_flags) & FL_ONGROUND) ^ FL_ONGROUND
ale i tak lepiej sprawdzić tak:
~pev(weaponBox, pev_flags) & FL_ONGROUND
Bo 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

  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#14 sebul

    Godlike

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 16.07.2014 11:36

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.

Jak tak nowa funkcja nie pasuje, to można próbować też tak
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?


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?

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.
  • +
  • -
  • 0
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Generator tabeli expa - aż do 103600 poziomu

#15 Andrzejek

    Ucze się :]

  • Autor tematu
  • Power User

Reputacja: 131
Zaawansowany

  • Postów:1300
  • GG:
  • Steam:steam
  • Imię:Andrzej
  • Lokalizacja:Wadowice
Offline

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 ?


  • +
  • -
  • 0

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


#16 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 16.07.2014 11:45

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?

Ż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?"

Co do kodu to przypatrz... Kod podany przez ciebie:
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)
  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#17 sebul

    Godlike

  • Junior Admin

Reputacja: 2016
Godlike

  • Postów:5411
  • Steam:steam
  • Imię:Sebastian
  • Lokalizacja:Ostrołęka
Offline

Napisano 16.07.2014 11:51

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. Akurat tutaj jest wszystko jasne, ale tak jak napisałem, ktoś nieumiejętnie będzie z tego korzystał, a potem będzie się dziwił, że jedyną osobą, która powinna rozumieć napisany kod, będzie on sam.

Zresztą "czytelność kodu > maksymalna optymalizacja". Wiadomo, że jakaś optymalizacja jest potrzebna, ale nie przesadzajmy.
  • +
  • -
  • 0
Posiadam TBM (inaczej PTB), które działa dużo lepiej niż zwykłe PTB, nawet na modach z lvlami. Zainteresowany? Proszę bardzo
Generator tabeli expa - aż do 103600 poziomu

#18 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

Napisano 16.07.2014 12:01

Zresztą "czytelność kodu > maksymalna optymalizacja".

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 dlaczego

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.

? 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:

Tylko zaciemnia kod i potrafi spowodować naprawdę niemiłe błędy....

Tak zwane logiczne psychologiczne podejście do sprawy. Jak fajnie mieć psychologa w rodzinie haha.gif (leczy mnie na weekend'y)

Użytkownik BlackPerfum edytował ten post 16.07.2014 12:02

  • +
  • -
  • 1
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika

#19 GwynBleidD

    Godlike

  • Administrator

Reputacja: 1849
Godlike

  • Postów:3066
  • Steam:steam
  • Lokalizacja:Przemyśl
Offline

Napisano 16.07.2014 15:11

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ć.

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.

A co to znaczy, że nie ma gwarancji? W zależności od implementacji języka pawn i od zasięgu tej zmiennej może być z tym różnie. Więc nie można absolutnie na tym polegać.

Dlaczego też twierdzę, że goto jest beznadziejne? Wiele popularnych języków programowania stara się zastąpić czymś innym to, co goto wprowadzało. Dla przykładu w pythonie pętla posiada else smile.png Kod w else wykona się, gdy pętla NIE zostanie przerwana instrukcją break.
  • +
  • -
  • 0
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ę.
 
1988650.png?theme=dark

#20 BlackPerfum

    Pseudo interakcja??

  • Power User

Reputacja: 453
Wszechobecny

  • Postów:575
  • Lokalizacja:...
Offline

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 xD

 

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  :rozpacz: A mogli coś takiego zrobić...


  • +
  • -
  • 0
Chcesz napisać do mnie na PW to:
Spoiler

Mój tok myślenia jest błędny? Wskaż mi błąd zmienie to!

Aktualnie bije limit 32 graczy (łącze serwery) ale nadal są lagi przy zbyt dużym przesyłu informacji Dołączona grafika
Gra się płynnie do 40~50 graczy potem łącze pada i zamiast biegać ludzie się teleportują Dołączona grafika




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych