Jump to content

Meric

Uživatel
  • Příspěvků

    90
  • Registrován

  • Aktivní

Příspěvky posted by Meric

  1. před 20 hodinami, QWER said:

    Ja si to prečítam za teba a tiež to za teba urobím. Ok? :kappa:

    Tak pardon, že jsem si dovolil se zeptat, pane. To je fuk, už je to pasé. Ten includ jsem nerozchodil, byly tam interní nesrovnalosti, přes které mi nedovolilo funkčně zkompilovat skript i přestože jsem udělal dost úprav, které opravily dost těchto "chyb". Což se samozřejmě dalo čekat vzhledem k tomu, co jsem už napsal. Zkouším to teďka zase trochu jinak. 

     

    Pokud mi samozřejmě nějaká hodná duše třeba ukáže jak by se to dalo obejít bez zbytečných bugů, byl bych mu určitě neskonale vděčný. :-) Mezitím zkusím nějaké jiné způsoby. 

  2. On 15. 5. 2018 at 2:27, QWER said:

    Najlepšie čo môžeš urobiť je použiť https://github.com/oscar-broman/samp-weapon-config ale vyžaduje plugin

    Dobře, který plugin to prosím vyžaduje? Mimochodem nahlédl jsem do includu a je tam fakt kopa věcí, co by se hádala s některými skripty v módu. A i kdybych to nějak vymyslel a smazal to a nechal tam jen to, co potřebuji, tak do kterých callbacků by asi bylo nejlepší ty fáze zařazovat, aby to bylo dostatečně efektivní? 

  3. Musí to být nutně amount? Aby se mi to nekřížilo s proměnnou Damage, kterou jsem si vytvořil kvůli úpravě hodnot poškození. A hlavně ve které části to podmínit, protože těch podmínek ohledně zdraví a vesty hráče tam mám poměrně dost, takže si ani nejsem úplně jist, kde bych to měl podmínit poté, co tu hodnotu zjistím a tak, aby to bylo efektivní afunkční.

  4. Co jsem se tak dočetl, tak funkce GetPlayerHealth v tomhle callbacku nefunguje, nebo alespoň ne jak má. Přesto to mám úplně nejvýše v callbacku, nějak to tam toleruji. Já tam tedy zjišťuji HPčka přes hráčskou proměnnou Health. Nevím jestli jsi to tak myslel a já tě teď jen nepochopil, ale právě já té smrti a tedy následnýmu spawnu chci vyhnout a pracovat pouze s OnPlayerTakeDamage. Pak je tu tedy ten zásadní problém s hráčskými proměnnými Exprepared, InPreDeathMode a InDeathMode. Co jsem si kontroloval podmínky, tak by měly bejt správně, ale asi dávám špatný sled, jen nevím jak by měl být správně. Abych ty proměnný vysvětlil a někteří nad tím nemuseli nějak přemýšlet a louskat jak to mám zpracovaný, tak to sepíšu.

     

    Exprepared - Připraven na popravu, tj. že když ho hitneš ještě jednou, automaticky ho to hodí do druhé fáze. Jenže to se stává už při první "smrti", která tedy proběhne i se spawnem, protože dosáhne s HP na 0.

    Popraven - To je asi jasné, napomáhá k odkázání na update labelu a zabití v tu dobu již zbytečnýho timeru a povolení k použití příkazu /death.

    InPreDeathMode - 1. fáze smrti.

    InDeathMode - Definitivní fáze, na kterou odkazuje proměnná "Popraven". Myslím, že je to asi všem jasné, ale uvědomuji si, že můj kód je zmatený a proto to vypisuji.

  5. Ahojte. Narazil jsem na problém v publicu OnPlayerTakeDamage, kde si spravuji systém poškození a na něj napojuji i death systém. Bohužel však to má spoustu zádrhelů. Zaprvé abych se přiznal, tak jsem se už dalo by se říct že ztratil ve vlastních podmínkách. :d Teď nevím jak do kódu řádně a funkčně zakomponovat pojistku, která by zařídila, aby daný hráč nezemřel a tedy ho kód za žádnou cenu neodkázal na OnPlayerSpawn, tedy když poškození bude větší nebo rovno zdraví hráče, tak aby mu to na místo poškození nastavilo HPčka cca na 20 bodů zdraví. Tento systém smrti má dvě fáze - 1. kritické zranění, 2. definitivní smrt, která nastane buď po uplynutí času bez záchrany nebo při popravě. Samozřejmě pokud se tomu nějak nevyhnu tak nevadí, budu muset asi jen ukládat pozice.

     

    Každopádně dalším problémem je, že místo toho, aby to hráče hodilo nejprve do 1. fáze, tak rovnou zahyne, objeví se někde jinde (přirozeně, když se neukládá pozice a do OnPlayerSpawn by se ani dostat neměl - tedy skript by to ve finále neměl dovolit) a je je rovnou v druhé fázi, tedy té definitivní. Nevím proč, nejspíše jsem se zamotal do svých podmínek a špatně jsem je umístil a teď už nevím jak dál.

     

    Než se do mě tady někdo pustí že jsem neoriginální: Ano, vím. Ač se mi to příliš také nelíbí, jsem vzhledem k okolnostem nucen se naklonit k tomu, co ode mně poměrně velká část komunity požaduje. 

     

    https://pastebin.com/1r4FmuTw

     

    Když tam uvidíte nějaké nesmysly a zbytečnosti, předem upozorňuju, že poslední dobu jsem tam zkoušel leccos metodou pokus/omyl a plácal jsem se s tím pomalu.

  6. Vzhledem k tomu, že jsi se ptal také na limity CreateObject() s tím počítám. Na LARPu je to řešené tak, že se používá CreateDynamicObject a funkce AttachDynamicObjectToVehicle a pracuje se s proměnnými na sloty pro doplňky a podobně. Co je mi známo, tak na dynamické objekty nejsou početní limity a celkově na serveru jich můžeš mít neomezeně mnoho (samozřejmě načítání těch objektů už je jiná věc).

    Samozřejmě funkci AttachDynamicObjectToVehicle využiješ při načítání vozidel a těchto doplňků pro vozidla v nějakém stocku pro načítání vozidel co si vytvoříš nebo máš vytvořený. Zkus to zaměnit a nevyužívat samotný attachnutí po vytvoření toho objektu. Samozřejmě nevím jak to máš v plánu zpracovávat, nicméně předpokládám, že budeš chtít, aby se dalo upravovat umístění, tak tedy EditDynamicObject by měl svojí úlohu splnit. Funkci na attachnutí zkus tedy pouze u načítání vozidel. 

    Samozřejmě nějaký zkušenější pawner (kterých je zde dost) mi může oponovat a říci, že nápad je to špatný a nemělo by se to tak dělat a tak to budu plně respektovat.

  7. Eh.. No, popravdě tomu pořád stále moc nerozumím, ukázal bys mi to na kódu, prosím? Dost se v tom ztrácím. Asi i to, jak zapsat nový stav kasy, protože teď mě vůbec nenapadá, jak to udělat. Samozřejmě u výplaty určitě nemůžu udělat to, že bych smazal samotné přičítání, jinak by se peníze nemohly nastackovat. Narazil jsem na logický problém a jsem celkem mimo. Tak kdybys byl tak hodný a ukázal mi to na kódu, určitě bych byl vděčný. :)

  8. Nevím, co přesně máš namysli tou kontrolou, ze které kasy se to má odčítat, měl jsem za to, že právě ten cyklus by měl určit tu danou kasu, protože se předpokládá, že člověk bude stát pouze u jedné. Samozřejmě zde mi přišlo zbytečný volat funkci IsPlayerInRangeOfPoint, protože to je už u příkazu /kasa. Jakou kontrolu máš přesně namysli? 

  9. Ahoj, tak jsem tady zas. Mám problém se špatně fungujícím dialogem kasy. Stále mi to píše, že v kase nemám dost peněz, i přestože tam jsou. Na testovacím serveru mi to napíše ale i dá ty peníze, de facto se vykoná to, co chci, ale na veřejným, který už narozdíl od testovacího není prázdný to pouze píše tu hlášku a nedá to ani floka. Kontroloval jsem i jestli se hodnota při každé výplatě, kdy chodí i do kasy tržba ukládá. To také dělá, ale špatně. Při vytvoření podniku a upravení ceny například na 1 000 000 to funguje správně, do kasy jde každou hodinu 10 000 podle vzorce (který nejspíš upravím). Ale když k tomu koupím druhý podnik, s cenou třeba 50 000, tak místo aby do jedné kasy šlo 10 000 a do druhé 500, tak v jedné je 10 000 a v druhé 10 500. Dle toho usuzuji, že je chyba v cyklu, ale jak to změnit, aby to fungovalo, nad tím se lámu už hodiny a jsem bezradný. Nejsem sice úplně začátečník, ale nějaké ty mezery ještě mám, tak to prosím berte v úvahu, děkuji. Přiložím pro jistotu úplně vše, co nějak souvisí s kasou. Na požádání můžu poslat i další části, když to pomůže k vyřešení problémů. Budu rád za každou pomoc. :-)

     

    Spoiler
    
    enum
    {
    ...
    DIALOG_KASABIZ,
    ...
    
    enum sBiz
    {
    	ID,
    	Owner[MAX_PLAYER_NAME],
    	Name[32],
    	Locked,
    	BKasa,
    	bool:LightsInt,
    	Float:X,
    	Float:Y,
    	Float:Z,
    	Float:A,
    	Interior,
    	Price,
    	Movein[24],
    	Text3D:BizLabel,
    	PickupID
    }
    
    new Biz[BIZ_MAX_ID][sBiz];
    
    
    ...
    forward LoadBiz(i, name[], value[]);
    ...
    
    
    // Příkaz:
    
    CMD:kasa(playerid, params[])
    {
        if(!Player[playerid][Pes])
    	{
    		if(IsPlayerInRangeOfPoint(playerid, 2, 919.2477,-41.1382, 1493.5973))
    		{
    			if(Player[playerid][Faction] == fGOV)
    			{
    		        SPD(playerid, DIALOG_MKASA);
    		        return 1;
    		    }
    		    else return ErrorBox(playerid, "Nejsi ve frakci GOV.");
    		}
    	    else
    	    {
    	        for(new i = BIZ_START_ID; i < BIZ_MAX_ID; i++)
    			{
    			    if(IsPlayerInRangeOfPoint(playerid, 2, Biz[i][X], Biz[i][Y], Biz[i][Z]))
                 	{
    	                new name[MAX_PLAYER_NAME], temp[128];
    	                name = GetName(playerid);
    					if(strcmp(Biz[i][Owner], name, true, MAX_PLAYER_NAME) == 0)
    					{
    						format(temp, sizeof(temp), "V kase máte %d$. Zadejte částku jakou si přejete vybrat.", Biz[i][BKasa]);
    						ShowPlayerDialog(playerid, DIALOG_KASABIZ, DIALOG_STYLE_INPUT, "KASA PODNIKU - TRZBA", temp, "Vybrat", "Storno");
    		 				return 1;
    					}
    					else return ErrorBox(playerid, "Nejsi vlastnikem podniku.");
    				}
    			}
    		}
    		return ErrorBox(playerid, "Tento prikaz ted nemuzes pouzivat.");
    	}
    	else return ErrorBox(playerid, "Jsi pes, nemuzes vybirat penize z kasy.");
    }
    
    // Dialog
                                                         
     case DIALOG_KASABIZ:
    		{
    		    if(response)
    		    {
    		        if(isnumeric(inputtext))
    		        {
                        for(new i = BIZ_START_ID; i < BIZ_MAX_ID; i++)
                        {
    						new prachy = strval(inputtext);
    		            	if(Biz[i][BKasa] >= prachy)
    		            	{
    							new str[80];
    							GivePlayerMoneyEx(playerid, prachy);
    							Biz[i][BKasa] -= prachy;
    							format(str, sizeof(str), "> Vybral jsi z kasy tržbu v hodnotě %d$.", prachy);
    							SCM(playerid, INFOCOLOR, str);
    						}
    						else return ErrorBox(playerid, "Tolik penez v kase nemas");
    					}
    				}
    				else return ErrorBox(playerid, "Hodnota musi byt ciselna");
    			}
    		}
    
    // OnPlayerKeyStateChange - KEY_YES - Vstupní poplatek
    
    for(new i = BIZ_START_ID; i < BIZ_MAX_ID; i++)
    		{
    			if(IsPlayerInRangeOfPoint(playerid, 2, Biz[i][X], Biz[i][Y], Biz[i][Z]))
    			{
    				if(strcmp(Biz[i][Owner], "Los_Angeles", true, MAX_PLAYER_NAME) == 0 || Spot[playerid])
    				{
    					TeleportToBiz(playerid, i);
    					return 1;
    				}
    				else
    				{
    				    new name[MAX_PLAYER_NAME], temp[128];
    				    name = GetName(playerid);
    	       			if(strcmp(Biz[i][Owner], name, true, MAX_PLAYER_NAME) == 0)
    	          		{
    	            		TeleportToBiz(playerid, i);
    	              	}
    	                else
    	                {
    						new fee = Biz[i][Price] / 10000;
    						GivePlayerMoneyEx(playerid, -fee);
    						Biz[i][BKasa] += fee;
    						TeleportToBiz(playerid, i);
    						new moneyb = Biz[i][BKasa];
    						format(temp, sizeof(temp), BIZPATH, i);
    						if(fexist(temp))
    						{
    		    				new INI:File = INI_Open(temp);
    							INI_WriteInt(File, "Kasa", moneyb);
    		    				Biz[i][BKasa] = moneyb;
    						    INI_Close(File);
    						    return 1;
    						}
    					}
    				}
    		    }
    		}
                                             
     // stock LevelUp(playerid)
     // Kontrola každé nahrané minuty kvůli výplatě
     ...
      		if(IsBizOwner(playerid))
    		{
    		    Player[playerid][BizOwner] = true;
    		} else {
    		    Player[playerid][BizOwner] = false;
    		}
     ...      
     // Kontrola každé nahrané hodiny v tom stejném stocku - výplata
     
    if(Player[playerid][BankAcc] == true)
    		{
    		    new penize;
    			new danzaauta;
    			new totaldanzaauta = 0;
    			new danzadomy;
    			new totaldanzadomy = 0;
    			new totalnipenize;
    			new pname[MAX_PLAYER_NAME];
    			new bizpenize;
    			new zaklad = 0;
    			format(pname, sizeof(pname), "%s", GetName(playerid));
    
    		        for(new i = 1; i < MAX_VEHICLES; i++)
    		        {
    		            if(IsValidVehicle(i))
    		            {
               				if(Vehicle[i][Faction] == 0)
    			            {
    					    	if(strcmp(Vehicle[i][Owner], pname, true) == 0)
    							{
    							    if(Vehicle[i][CoinBought] == false)
    							    {
    								    danzaauta = VehiclePrices[Vehicle[i][Model] - 400][0] / 100 * DAN_ZA_AUTO / 20;
    								    totaldanzaauta += danzaauta;
    								}
    							}
    						}
    					}
    		        }
    
    		    for(new i2 = HOUSE_START_ID; i2 < HOUSE_MAX_ID; i2++)
    		    {
    		        if(strcmp(House[i2][Owner], pname, true) == 0)
    		        {
    		            if(House[i2][CoinBought] == false)
    		    		{
    			            danzadomy = House[i2][Price] / 100 * DAN_ZA_DUM / 20;
    			            totaldanzadomy += danzadomy;
    					}
    		        }
    		    }
    
    		    for(new i2 = GARAGE_START_ID; i2 < GARAGE_MAX_ID; i2++)
    		    {
    		        if(strcmp(Garage[i2][Owner], pname, true) == 0)
    		        {
    		            if(Garage[i2][CoinBought] == false)
    		    		{
    			            danzadomy = Garage[i2][Price] / 100 * DAN_ZA_DUM / 20;
    			            totaldanzadomy += danzadomy;
    					}
    		        }
    		    }
    		    
    		    for(new i2 = BIZ_START_ID; i2 < BIZ_MAX_ID; i2++)
    		    {
    		        if(strcmp(Biz[i2][Owner], pname, true) == 0)
    		        {
    					new temp[128];
    					danzadomy = Biz[i2][Price] / 100 * DAN_ZA_DUM / 20;
    		            totaldanzadomy += danzadomy;
    		            bizpenize = Biz[i2][Price] / 100;
    		            zaklad += bizpenize;
    					format(temp, sizeof(temp), BIZPATH, i2);
    					if(fexist(temp))
    					{
    						new INI:File = INI_Open(temp);
    						INI_WriteInt(File, "Kasa", zaklad);
    						Biz[i2][BKasa] += zaklad;
    		   				INI_Close(File);
    					}
    		        }
    		    }
    // Načítání
                                                           
    public LoadBiz(i,name[],value[])
    {
        INI_Int("ID",Biz[i][ID]);
        INI_String("Owner", Biz[i][Owner], MAX_PLAYER_NAME);
        INI_String("Name", Biz[i][Name], 32);
        INI_Int("Locked", Biz[i][Locked]);
        INI_Bool("Lights", Biz[i][LightsInt]);
        INI_Float("X",Biz[i][X]);
        INI_Float("Y",Biz[i][Y]);
        INI_Float("Z",Biz[i][Z]);
        INI_Float("A", Biz[i][A]);
        INI_Int("Kasa", Biz[i][BKasa]);
        INI_Int("Interior",Biz[i][Interior]);
        INI_Int("Price",Biz[i][Price]);
        INI_String("Movein", Biz[i][Movein], MAX_PLAYER_NAME);
        return 1;
    }                                                       

     

     // EDIT: Ještě dotaz. V čem může být ten pekelný problém, když se občas stává, že se domy, garáže nebo podniky "pokazí" po restartu a musím je odebrat, aby fungovaly zase textdrawy a mapping z filterscriptů? Samozřejmě nezasažené pickupy zůstávají na místě, kde byly a ty "poškozené" mizí, pokud si dobře pamatuji na souřadnice 0 0 0. A taky se stává, že se někdy pokazí i systém ukládání a stocky na ukládání dat pro hráče a pro jejich vozidla skript za běhu ignoruje. Čím to může být způsobeno?

  10. Pff, tak já nevím. Testoval jsem to a pásku to vytvoří v místě, kde má, pak se to upravuje. Samozřejmě jeden člověk může vytvořit i více pásek, ale na místě to vytvoří jen jednu pásku s daným ID. S tou se pak pracuje a kdykoliv se může smazat. Když se to testovalo na serveru, nikdo žádnou chybu ani nehlásil, naopak si s tím policajti docela hojně hráli. :-D Každopádně to duplicitní zjišťování pozic jsem vymazal, a zkusím jak to bude fungovat bez toho cyklu tedy. Jinak jak jsi mi ukázal ten příklad zjednodušeného příkazu:

     

    EditDynamicObject(playerid, Paska[i][pObject]);
    LastPaskaEdit[playerid] = i;
    PaskaEdit[playerid] = true;

    Tam být musí, protože pracuji s publicem OnPlayerEditDynamicObject, jsem si tak všiml, že jsi to v příkladu neuvedl a napsal jsi tam EditPaska(playerid); jsem pak byl trochu zmaten z toho, kde jsi to vzal. :d 

  11. Máš v globálu napsáno "#if defined FILTERSCRIPT" nebo "#define FILTERSCRIPT"? Je důležitý, aby pawno rozpoznalo, zda děláš gamemode nebo filterscript. Mělo by to být zapsáno. Viděl jsem i případy, kde to být nemusí (proč, to ti já nepovím, až tak pokročilý nejsem). Pokud to tam nemáš, tak to aspoň zkus, jestli někdo nebude mít lepší nápad. 

  12. Jo, to je protože jsem ten kód celý upravoval na jiný systém a trochu to chtěl zrenovovat, abych na to nemusel mít dva různý příkazy a k tomu jsem přidal i možnost úpravy. Abych se přiznal, nejsem sice úplně začátečník, ale nejsem ani úplně pokročilý. Původně jak jste mě opravili u toho EditDynamicObject "i" na "playerid", tak tam jsem měl právě to playerid původně a taky to nefachalo, takže tohle byl spíš hokus pokus. Dost jsem už pozapomínal po době, co jsem s pawnem nedělal. Ale už je to vyřešené a děkuji vám za pomoc. Už jsem nezaznamenal chybu. Pošlu sem ještě kód, abych ukázal řešení. 

     

    Spoiler
    
    CMD:cross(playerid, params[])
    {
        new typ[100];
        if(Player[playerid][Faction] == fPD || Player[playerid][Faction] == fSD)
        {
            if(Player[playerid][fDuty] == true)
            {
                if(!sscanf(params, "s[100]", typ))
                {
                    if(strcmp(typ, "polozit", true) == 0)
                    {
                        CreatePaska(playerid);
                        return 1;
                    }
                    else if(strcmp(typ, "upravit", true) == 0)
                    {
                        new i = GetClosestPaska(playerid);
                        if(IsPlayerInRangeOfPoint(playerid, 20.0, Paska[i][paX], Paska[i][paY], Paska[i][paZ]))
                        {
                            EditDynamicObject(playerid, Paska[i][pObject]);
                            LastPaskaEdit[playerid] = i;
                            PaskaEdit[playerid] = true;
                            return 1;
                        }
                        else return ErrorBox(playerid, "Nejsi pobliz zadne pasky.");
                    }
                    else if(strcmp(typ, "sebrat", true) == 0)
                    {
                        DeleteClosestPaska(playerid);
                        return 1;
                    }
                } else return SCM(playerid, -1, "SYNTAXE: /cross [POLOZIT, SEBRAT, UPRAVIT]");
            } else return ErrorBox(playerid, "Nejsi ve sluzbe.");
        } else ErrorBox(playerid, "Tento prikaz nemuzes pouzivat.");
        return 1;
    }
    
    stock CreatePaska(playerid)
    {
        new temp[128];
        for(new i = 0; i < sizeof(Paska); i++)
        {
            format(temp, sizeof(temp), PASPATH, i);
            if(!fexist(temp))
            {
                new Float:px, Float:py, Float:pz, Float:pa;
                GetPlayerPos(playerid, px, py, pz);
                GetPlayerFacingAngle(playerid, pa);
                GetXYInFrontOfPlayer(playerid, px, py, 1.5);
    
                new INI:File = INI_Open(temp);
                INI_WriteFloat(File, "X", px);
                Paska[i][paX] = px;
                INI_WriteFloat(File, "Y", py);
                Paska[i][paY] = py;
                INI_WriteFloat(File, "Z", pz - 0.1);
                Paska[i][paZ] = pz - 0.1;
                INI_WriteFloat(File, "RotX", 0.0);
                Paska[i][paRX] = 0.0;
                INI_WriteFloat(File, "RotY", 0.0);
                Paska[i][paRY] = 0.0;
                INI_WriteFloat(File, "RotZ", pa);
                Paska[i][paRZ] = pa;
                INI_Close(File);
    
                Paska[i][pObject] = CreateDynamicObject(19834, px, py, pz, 0, 0, pa);
                return 1;
            }
        }
        return 0;
    }
    
    
    stock GetClosestPaska(playerid)
    {
            new
                    retElement = -1,
                    Float:distance = 9999.0
            ;
            new temp[128];
            for(new i = 0; i < MAX_PASKA; i++)
            {
                format(temp, 128, PASPATH, i);
                if(fexist(temp))
                {
                    if(IsValidDynamicObject(Paska[i][pObject]))
                    {
                        new Float:odist = GetPlayerDistanceFromPoint(playerid, Paska[i][paX], Paska[i][paY], Paska[i][paZ]);
                        if (retElement == -1)
                        {
                            retElement = i;
                            distance = odist;
                        }
                        else if (odist < distance)
                        {
                            retElement = i;
                            distance = odist;
                        }
                    }
                }
            }
            return retElement;
    }
    
    stock DeleteClosestPaska(playerid)
    {
        for(new i = 0; i < MAX_PASKA; i++)
      	{
      	    new temp[128];
    		format(temp, sizeof(temp), PASPATH, i);
    		if(fexist(temp))
    		{
      	    	if(IsPlayerInRangeOfPoint(playerid, 2.0, Paska[i][paX], Paska[i][paY], Paska[i][paZ]))
            	{
    				fremove(temp);
    				Paska[i][paX]=0.0;
    	   			Paska[i][paY]=0.0;
    	      		Paska[i][paZ]=0.0;
    	      		Paska[i][paRX]=0.0;
    	        	Paska[i][paRY]=0.0;
    	         	Paska[i][paRZ]=0.0;
    	          	DestroyDynamicObject(Paska[i][pObject]);
    	          	SCMEx(playerid, INFOCOLOR, "> Smazal jsi pásku ID: %d.", i);
    	           	return 1;
    	        }
    		}
      	}
        return ErrorBox(playerid, "Nejsi dostatecne blizko.");
    }

     

     

  13. Ahojte, po dlouhé době jsem se dostal k pawnu a narazil jsem na problém, který jsem řešil asi 3 hodiny a furt nemůžu přijít na to, kde je chyba. Příkaz funguje jak má, ale jen u objektu s pořadovým ID 0. Tudíž když vytvořím druhou pásku, tak nejde ani upravit, ani smazat. Už mi došly nápady, poradíte mi, prosím? :-)

    Spoiler
    
    CMD:cross(playerid, params[])
    {
    	new typ[100];
    	if(Player[playerid][Faction] == fPD || Player[playerid][Faction] == fSD)
    	if(sscanf(params, "s", typ)) return SCM(playerid, -1, "SYNTAXE: /cross [POLOZIT, SEBRAT, UPRAVIT]");
    
    	if(!strcmp("polozit", typ, false))
    	{
    		new Float:x, Float:y, Float:z, Float:a;
    		GetPlayerPos(playerid, x, y, z);
    		GetPlayerFacingAngle(playerid, a);
         	CreatePaska(x, y, z, a);
    	    return 1;
    	}
    	if(!strcmp("upravit", typ, false))
    	{
    	    for(new i = 0; i < MAX_PASKA; i++)
    	    {
         		if(IsPlayerInRangeOfPoint(playerid, 2.0, Paska[i][paX], Paska[i][paY], Paska[i][paZ]))
         		{
         		    EditDynamicObject(i, Paska[i][pObject]);
         		    LastPaskaEdit[playerid] = i;
         		    PaskaEdit[playerid] = true;
         		    return 1;
         		}
         	}
         	return ErrorBox(playerid, "Nejsi dostatecne blizko.");
        }
    	if(!strcmp("sebrat", typ, false))
    	{
            DeleteClosestPaska(playerid);
    		return 1;
    	}
    	return 1;
    }
    
    // Stocky
    
    stock CreatePaska(Float:x,Float:y,Float:z,Float:a)
    {
    	new temp[128];
    	for(new i = 0; i < sizeof(Paska); i++)
      	{
      	    format(temp, sizeof(temp), PASPATH, i);
    		if(!fexist(temp))
      		{
        		new Float:px, Float:py, Float:pz;
          		GetPlayerPos(i, px, py, pz);
            	GetXYInFrontOfPlayer(i, px, py, 1.5);
    
    			new INI:File = INI_Open(temp);
    			INI_WriteFloat(File, "X", px);
    			Paska[i][paX] = px;
    			INI_WriteFloat(File, "Y", py);
    			Paska[i][paY] = py;
    			INI_WriteFloat(File, "Z", pz - 0.1);
    			Paska[i][paZ] = pz - 0.1;
    			INI_WriteFloat(File, "RotX", 0.0);
    			Paska[i][paRX] = 0.0;
    			INI_WriteFloat(File, "RotY", 0.0);
    			Paska[i][paRY] = 0.0;
    			INI_WriteFloat(File, "RotZ", 0.0);
    			Paska[i][paRZ] = 0.0;
    			INI_Close(File);
    
            	Paska[i][pObject] = CreateDynamicObject(19834, x, y, z, 0, 0, a);
      			return 1;
    		}
      	}
      	return 0;
    }
    
    
    stock DeleteClosestPaska(playerid)
    {
        for(new i = 0; i < MAX_PASKA; i++)
      	{
      	    new temp[128];
    		format(temp, sizeof(temp), PASPATH, i);
    		if(fexist(temp))
    		{
      	    	if(IsPlayerInRangeOfPoint(playerid, 2.0, Paska[i][paX], Paska[i][paY], Paska[i][paZ]))
            	{
    				fremove(temp);
    				Paska[i][paX]=0.0;
    	   			Paska[i][paY]=0.0;
    	      		Paska[i][paZ]=0.0;
    	      		Paska[i][paRX]=0.0;
    	        	Paska[i][paRY]=0.0;
    	         	Paska[i][paRZ]=0.0;
    	          	DestroyDynamicObject(Paska[i][pObject]);
    	          	SCMEx(playerid, INFOCOLOR, "> Smazal jsi pásku ID: %d.", i);
    	           	return 1;
    	        }
    		}
      	}
        return ErrorBox(playerid, "Nejsi dostatecne blizko.");
    }
    
    // Související část z plně funkčního OnPlayerEditDynamicObject
    
    		.....
    		if(PaskaEdit[playerid] == true)
    		{
    			format(temp, sizeof(temp), PASPATH, LastPaskaEdit[playerid]);
    			new INI:File = INI_Open(temp);
    			INI_WriteFloat(File, "X", x);
                Paska[LastPaskaEdit[playerid]][paX]= x;
                INI_WriteFloat(File, "Y", y);
                Paska[LastPaskaEdit[playerid]][paY]= y;
                INI_WriteFloat(File, "Z", z);
                Paska[LastPaskaEdit[playerid]][paZ]= z;
                INI_WriteFloat(File, "RotX", rx);
                Paska[LastPaskaEdit[playerid]][paRX]= rx;
                INI_WriteFloat(File, "RotY", ry);
                Paska[LastPaskaEdit[playerid]][paRX]= ry;
                INI_WriteFloat(File, "RotZ", rz);
                Paska[LastPaskaEdit[playerid]][paRX]= rz;
    
                InfoBox(playerid, "Paska ulozena");
                PaskaEdit[playerid] = false;
    		}
    		if(.....)

     

     

  14. crashdetect si můžeš najít kdekoliv na netu, je to plugin. Takže až to stáhneš, tak .dll soubor a .so (pro Linux) do složky plugins a zapsat k plugins do server.cfg. K tomu -d3 přepínači. Stačí když si vytvoříš .cfg soubor s názvem pawn do složky pawno. Ten otevřeš a napíšeš tam -d3, uložíš a překompiluješ skript.

     

    Pak by ti to při kompilaci mělo vypisovat více informací, jako o počtu cells a pdoobné věci. Toho se vůbec neboj. Potom spustíš samp-server a v cmd řádku jak jsi vypsal tu chybu, tak se ti bude zobrazovat i [debug] a nějaký text. Crashdetect, případně nativechecker plugin ti v tom můžou pomoci taky detekovat problém. Oba pluginy je dobrý mít.

  15. Neměl, dal jsem to tam a stále nefunguje. Jak jsem psal můžu přiložit kod modu.

     

    Můžeš no. A kam jsi to dal? Nejlépe, když to vložíš do globálu, kde si definuješ třeba new Auto[MAX_PLAYERS];, hlavně ne pod žádný public.

     

    A pokud to tak máš a nejde to, asi přilož kód, no. Kolik máš řádků?

  16. Ano, používám SQLite, no. Já ti asi radši hodím úplně kompletní kód. Protože já teďka řeším to, že když seberu bedn a někde jí položím, má pak místo ID 2 třeba ID 560 a obsah se v té krabici pak vůbec nenachází, prostě se ztratí. Předem upozorňuju, že je to docela dost dlouhý kód. Dávám tam vše, aby jsem nemusel dodávat postupně věci a zbytečně se to neprotahovalo

     

    Kód je dost dlouhý, hlavně co se týče dialogů. UPDATE SET tam je. Hlavně mi jde o ukládání, protože potřebuju aby se ukládalo aspoň i při přesunu a později tadyta uložená data s bednou pak i do přívěsu, kterej bude na stejným principu co dialog u té bedny.

     

    https://pastebin.com/sH6kNchY

     

    EDIT: Právě jsem tam hodil nově kód, protože jsem vynechal příkaz na sebrání a pokládání, dost důležitá část.

  17. No, míchání systémů ukládání mýmu serveru nikdy nedělalo dobrotu. Mám vytvořený tak, že když sebereš bednu, tak se ta bedna z databáze smaže a když položíš, tak zase se tam vytvoří, jelikož UPDATE SET nefungovalo, tak jsem to musel udělat přes smazání a znovuvytvoření. Každopádně i kdybych ukládal informace o obsahu separativně od db do texťáku, stejně nevím jak bych to tam nahrál.

     

    Ce se IDček týče: Vždycky se generuje o číslo vyšší. Aspoň podle toho kolik beden existuje. Při UPDATE SET testu mi to hodilo ID 308 místo 7, nebo 8. A když jsem vypnul a zapnul server, tak bedna byla a staré pozici co byla původně a s tím prvním IDčkem, tedy 7 nebo 8. Jak úplně upravit IDčkování nevím, jsem rád, že to vůbec funguje. icon_e_biggrin.gif

     

    Ukládání informací podle ID je tedy pro mě asi méně přijatelné, snadno by došlo k chybě ohledně ztrát předmětů. Buď bych poslal kód, s tím že by se ta věc i IDčkama upravila tak, aby to podle toho nějak šlo, nebo to ukládat podle jinýho parametru. Bohužel mě žádný jiný parametr nenapadá.

     

    Každopádně díky za to k těm animacím, pomohlo to. Už to funguje. :-) 

  18. Používám na DynamicObject ten SetPlayerAttachedObject, no. Ošéfil sjem to tak, že se to chová jako doplněk, když si přes attachments nasadíš klobouk nebo tak. Teď mi spíše jde o to vymyslet, jak udělat to, že se budou ukládat předměty, které jsou v bedně, kterou hodíš například do přívěsu náklaďáku. Protože to má fungovat tak, že dáš /prives a tam vložíš do slotu pro bednu tu bednu a pak jí můžeš vytáhnout. Ta aby v té bedně se neanulovaly informace, že v ní je určitý počet předmětů, například M4, nebo Desert Eagle, nebo Cocaine a takové. Tahle otázka ukládání mě napadla až teď, že to bude velmi komplikované, že nevím čeho se chytit.

  19. Jo už to vidím, pravda. Posunul jsem formátování ID textu s tím beID pod db result, kde vybírám ID přímo z databáze, která to automaticky incrementuje. Zatím to vypadá bez problému, díky. :-)

     

    Jen nevím jestli je to pravé ořechové použít u hráče SetPlayerAttachedObject nebo něco jiného. Tam není argumentace pro objectid. Chtěl bych to udělat tak, že dám /sebrat a vyloženě tu bednu sebere, bez DestroyDynamicObject. A jestli se to bez toho neobejde tak něco, abych pak mohl uchovat předměty v té bedně při přesunu. Ať už vkladu do přívěsu nebo jen čistě přesunu. Celkově jde jen o to, aby se s tím dalo manipulovat i s obsahem uvnitř, ale u této fáze jsem to jaksi nedomyslel. Je možné tohle nějak přes SQL obejít?

     

    Napadlo mě totiž akorát, že bych mohl informace o obsahu bedny nahrát do vytvořených PlayerInfo a ukládat ty informace přímo k hráči a jak bych zničil objekt bedny a všechno s ní spojený, tak při pokládání by se to naopak z hráče zase nahrálo do té bedny. Ale nevím jestli je tohle efektivní.

  20. No, já už to udělal a nějak jsem to ošéfoval. Nevím v jaké funkci máš nyní namysli a jak přesně to myslíš, kdyžtak mi to podrobně popiš, když budeš tak hodný. Akorát nevím, proč při spawnutí té bedny se nepřidává IDčko. Vždy se spawne bedna s ID 0. To zapřičiní, že když vytvořím dvě bedny, tak se smaže jen jedna při příkazu smazatbednu. Kód mám tady. Úplně stejně to mám i s ostatními systémy a tam se IDčka počítají. Nevím kde jsem co vynechal.

     

    Kód zde: https://pastebin.com/feA8t61j

     

    Nevíte, co jsem tam udělal za chybu? Případně jak to zjednodušit.

     

    PS: Důvod, proč tam mám SetDynamicObjectPos je, abych ten objekt donutil nebýt ve vzduchu, ale na souřadnicích, kde chci.

×
×
  • Create New...