←  Pytania

AMXX.pl: Support AMX Mod X i SourceMod

»

Pobranie ID broni leżacej na ziemi

  • +
  • -
Andrzejek - zdjęcie Andrzejek 15.07.2014

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

Odpowiedz

  • +
  • -
Puchate - zdjęcie Puchate 15.07.2014

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
Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 15.07.2014

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

Odpowiedz

  • +
  • -
Puchate - zdjęcie Puchate 15.07.2014

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

Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 15.07.2014

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.

Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 16.07.2014

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

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 16.07.2014

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
Odpowiedz

  • +
  • -
Puchate - zdjęcie Puchate 16.07.2014

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

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 16.07.2014

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

Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 16.07.2014

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

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 16.07.2014

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.

Odpowiedz

  • +
  • -
Andrzejek - zdjęcie Andrzejek 16.07.2014

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?

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 16.07.2014

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
Odpowiedz

  • +
  • -
sebul - zdjęcie sebul 16.07.2014

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

  • +
  • -
Andrzejek - zdjęcie Andrzejek 16.07.2014

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 ?

Odpowiedz

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 16.07.2014

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

  • +
  • -
sebul - zdjęcie sebul 16.07.2014

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

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 16.07.2014

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
Odpowiedz

  • +
  • -
GwynBleidD - zdjęcie GwynBleidD 16.07.2014

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

  • +
  • -
BlackPerfum - zdjęcie BlackPerfum 16.07.2014

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

Odpowiedz