Üzenetek megjelenítése

Ez a szekció lehetővé teszi a felhasználó által írt összes hozzászólás megtekintését. Vedd figyelembe, hogy csak azokba a fórumokba írt hozzászólásokat látod, amelyekhez hozzáférésed van.


Üzenetek - kurta999

Oldalak: 1 ... 54 55 [56] 57 58 ... 184
826
OnPlayerKeyStateChange
Ez az eljárás akkor hívódik meg, mikor a játékos lenyom vagy elenged egy \"speciális (Kivéve a Fel-Le, Jobbra-Balra)\" gombot. Ezeket a gombokat a GetPlayerKeys() segítségével tudjuk ellenõrizni.
Paraméterek:
 
( playerid, newkeys, oldkeys )

 
playerid - Annak a játékosnak az azonosítója, aki megnyomta a gombot.
newkeys - A változó, ami a játékos által lenyomott gombok bitjeit tárolja.
oldkeys - A változó, amit azokat a biteket tárolja, amit a mostani gomb lenyomás elõtt tárolt. (Ha lenyomom az X betût, aztán Y-t, akkor amikor az Y-t lenyomta, akkor az X lesz az old keys)
Visszatérés 1 - Megengedi az eljárásnak hogy meghívódjon a többi scriptben. Ez mindig meghívódik a játékmódban, tehát a 0 visszatérés csak a filterscripteket akadályozza.
Információ


Ez az eljárás akkor hívódik meg, amikor a játékos lenyom, vagy elenged egy speciális gombot. Csakhogy nem minden gomb tartozik ide, csak azok a gombok, amik használva vannak alapból a játékban. Például ha az \"A\" betût akarod ellenõrizni, akkor azt nem lehet vele, de viszont azt igen, amikor lenyomja a sprint gombot. Azt a gombot fogja sprint gombnak venni, ami a játékosnak be van állítva. Ha SPACE, akkor SPACE, ha H, akkor azt, stb..
Paraméterek


A paraméterek az összes gomb száma, amit elengedtél, vagy amit épp lenyomtál. Ez az eljárás akkor hívódik meg, amikor valamilyen gomb státusz megváltozik. (Tehát ha lenyomtál egy gombot és azt elengetted, vagy csak simán lenyomtál egy gombot). Az információ, amit a paraméterek visszaadnak, az nem úgy van, mint a többi átlagos eljárásnál. Egy paraméterben adja vissza több gomb adatait. Ezt bitmûveletek segítségével tudjuk ellenõrizni. Minden gombnak megvan a saját bitje, és megnézzük, hogy a bit igaz-e, vagy hamis-e. Ha igaz, akkor levan nyomva, ellentétben nincs.
Hogy NE ellenõrizd a gombot


Ha le akarod ellenõrizni, hogy valaki lenyomta a lövés gombot, akkor azt nyilván valóan így csinálnád:
[pawn]if (newkeys == KEY_FIRE)[/pawn]
A kód mûködin fog, csak nem úgy, ahogy annak kéne. Próbálj meg legugolni és lenyomni a lövés gombot - a kód már nem is mûködik. Miért is?
Mivel a newkeys nem egyenlõ a \"KEY_FIRE\"-vel, hanem \"KEY_FIRE\" kombinálva a \"KEY_CROUCH\"-al.
Hogy ellenõrizd a gombot


Most már tudjuk, hogy a változó két gomb adatait tartalmazza, ezért csak azt kéne megnézni, hogy az a gomb benne-e van, amit lenyomtunk. Erre a bit maszkolás a megoldás. Minden gombnak van saját bitje a változóban (Bár pár gombnak ugyanaz a bitje, de azok kocsiban vagy gyalog vannak. Szóval nemfog keveredni, mert nem kerülhetnek egyszerre bele a változóba.)
Jelenleg csak egy bitet kell megnéznünk:
[pawn]if (newkeys & KEY_FIRE)[/pawn]
Az egy darab \'&\'-jel az a bitenkénti ÉS és nempedig a logikai ÉS.
Ha leteszteled a kódot, akkor fog mûködni. Gugolás vagy futás közben, az lényegtelen, akkor fog menni, amikor le van nyomva a lövés gombod. Csakhogy ezzel van egy kis probléma: Ez a kód akkor fog mûködni, amikor le van nyomva a lövés gombod. Így jó is lenne, csakhogy mint elõbb leírtak miatt akkor is menni fog, ha a lövés gombod le van nyomva (Tartod az egéren a kezed) és közben te lenyomsz egy gombot. (Legugolsz, felállsz, sprintelsz, stb...)
Hogy ellenõrizd ha lenyomják a gombot


Itt jön használatba az \"oldkeys\" paraméter is. Elõször meg kell nézni, hogy a \"newkeys\"-ben benne-e van, és hogy NINCS-e az oldkeys-ben. Mivel ha benne lenne ott is, akkor valószínûleg eddig is levont neki nyomva és közben lenyomott egy másik gombot.
A következõ kód megoldja ezt:
[pawn]if ((newkeys & KEY_FIRE) && !(oldkeys & KEY_FIRE))[/pawn]
Ez csak akkor fog meghívódni, amikor a KEY_FIRE megtalálható a \"newkeys\"-ben és nem pedig akkor, amikor ez le van nyomva és közben más gombokat nyomkálsz.
Hogy ellenõrizd ha elengedik a gombot


Ugyanaz a megoldás, mint a fentiben, csak fordítva.
[pawn]if ((oldkeys & KEY_FIRE) && !(newkeys & KEY_FIRE))[/pawn]
Hogy ellenõrizz több gombot


Ha azt akarod ellenõrizni, hogy a játékos lenyomja a lövés és a gugolás gombot, akkor a következõ kód mûködni fog.
[pawn]if ((newkeys & KEY_FIRE) && (newkeys & KEY_CROUCH))[/pawn]
De ha azt akarod ellenõrizni, hogy elõször lenyomta a lövés gombot, aztán pedig a gugolást, akkor ez a kód NEM FOG mûködni! Csak akkor fog mûködni, ha EGYSZERRE nyomja le azt a két gombot. A következõ megoldás sem fog rendesen mûködni:
[pawn]if ((newkeys & KEY_FIRE) && !(oldkeys & KEY_FIRE) && (newkeys & KEY_CROUCH) && !(oldkeys & KEY_CROUCH))[/pawn]
Miért nem? Mivel az OnPlayerKeyStateChange minden egyes gomb lenyomásnál/elengedésnél hívódik meg. Tehát ha õ lenyomja a \"KEY_FIRE\"-t, akkor meghívódik az OnPlayerKeyStateChange a \"KEY_FIRE\"-vel a \"newkeys\"-ben és nem az \"oldkeys\"-ben. Ekkor ha lenyomja a \"KEY_CROUCH\"-ot, akkor OnPlayerKeyStateChange meghívódik a \"KEY_CROUCH\"-al és a \"KEY_FIRE\"-vel a \"newkeys\"-ben, de közben a \"KEY_FIRE\" benen van az \"oldkeys\"-ben. Tehát itt hülyeséget csinál ez a megoldás: \"!(oldkeys & KEY_FIRE)\".  A megoldás nagyon egyszerû:
[pawn]if ((newkeys & (KEY_FIRE | KEY_CROUCH)) == (KEY_FIRE | KEY_CROUCH) && (oldkeys & (KEY_FIRE | KEY_CROUCH)) != (KEY_FIRE | KEY_CROUCH))[/pawn]
Ez a megoldás elsõ ránézésre nagyon komplikáltnak tûnik, pedig nem az. A kód azt csinálja, hogy ellenõrzi, hogy mind a két gomb benne-e van a \"newkeys\"-ben, de nincs-e az \"oldkeys\"-ben.
Egyszerûsítés


Gomb lenyomva tartása
Definíció:
[pawn]
// HOLDING(keys)
#define HOLDING(%0) \\
((newkeys & (%0)) == (%0))
[/pawn]
Egy gomb lenyomva tartása:
[pawn]if (HOLDING( KEY_FIRE ))[/pawn]
Több gomb lenyomva tartása:
[pawn]if (HOLDING( KEY_FIRE | KEY_CROUCH ))[/pawn]
Gomb lenyomása
Definíció:
// PRESSED(keys)
[pawn]#define PRESSED(%0) \\
(((newkeys & (%0)) == (%0)) && ((oldkeys & (%0)) != (%0)))[/pawn]
Egy gomb lenyomása:
[pawn]if (PRESSED( KEY_FIRE ))[/pawn]
Több gomb lenyomása:
[pawn]if (PRESSED( KEY_FIRE | KEY_CROUCH ))[/pawn]
Gomb elengedése
Definíció:
[pawn]// RELEASED(keys)
#define RELEASED(%0) \\
(((newkeys & (%0)) != (%0)) && ((oldkeys & (%0)) == (%0)))[/pawn]
Egy gomb elengedése:
[pawn]if (RELEASED( KEY_FIRE ))[/pawn]
Több gomb elengedése:
[pawn]if (RELEASED( KEY_FIRE | KEY_CROUCH ))[/pawn]
Példák


Nitró amikor lenyomja a lövés gombot
[pawn]
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (PRESSED(KEY_FIRE))
{
   if (IsPlayerInAnyVehicle(playerid))
   {
      AddVehicleComponent(GetPlayerVehicleID(playerid), 1010);
   }
}
return 1;
}
[/pawn]
Szuper ugrás
[pawn]
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (PRESSED(KEY_JUMP))
{
   new
      Float:x,
      Float:y,
      Float:z;
   GetPlayerPos(playerid, x, y, z);
   SetPlayerPos(playerid, x, y, z + 10.0);
}
return 1;
}
[/pawn]
Halhatatlanság amíg az ENTER gombot nyomja
[pawn]
new
Float:gPlayerHealth[MAX_PLAYERS];
#if !defined INFINITY
#define INFINITY (Float:0x7F800000)
#endif
public OnPlayerKeyStateChange(playerid, newkeys, oldkeys)
{
if (PRESSED(KEY_ACTION))
{
   // They just pressed the action key, save their
   // old health for restoration.
   GetPlayerHealth(playerid, gPlayerHealth[playerid]);
   SetPlayerHealth(playerid, INFINITY);
}
else if (RELEASED(KEY_ACTION))
{
   // They just let go of action - restore
   // their old health again.
   SetPlayerHealth(playerid, gPlayerHealth[playerid]);
}
return 1;
}
[/pawn]
Magyarázat


Nem kell aggódnod, hogy ezek a dolgok hogyan mennek végbe, végbe mennek és kész. HOLDING (Tartás) érzékeli, ha a játékos tartja a gombot. Tehát addig megy a holding, amíg azt a gombot el nem engeded. PRESSED érzékeli, ha csak simán lenyomtad a gombot. RELEASED érzékeli, ha elengedted a gombot. Ajánlott tovább olvasni, itt jön a lényeg:
Bináris számrendszerben a KEY_SPRINT a következõ:
 

0b00001000

 
Tehát a 4. bit. Ha a 4. bit igaz, akkor benne van a KEY_SPRINT és ha ellenõrizni akarjuk, hogy benne-e van, akkor csak megkell nézni, hogy a KEY_SPRINT benne-e van.
 
(newkeys & KEY_SPRINT)

 
vagy
 
(neweys & (1 << 3))

 
0001 binárisan az egy, ha ezt eltoljuk 3-al balra, akkor a következõ lesz: 1000 (8), ez pedig a KEY_SPRINT (8). Szóval itt a fenti megoldás sokkal egyszerûbb és átláhatóbbb. Ezt csak példának írtam.
KEY_SPRINT:
 

0b00001000

 
A KEY_JUMP pedig:
 

0b00100000

 
Ezek után a bitenkénti VAGY lefut és \"egyberakja\" õket.
Jelen esetben ez lesz a kívánt érték, amiben lefutott a bitenkénti VAGY a két érték között.
 

0b00101000

 
Kapcsolódó eljárások
OnPlayerStateChange: Ez az eljárás akkor hívódik meg, mikor a játékos megváltoztatja az állapotát.
Kapcsolódó függvények
GetPlayerKeys: Lekérdezi, hogy a játékos milyen gombot nyomott meg.
Eredeti téma: http://wiki.sa-mp.com/wiki/OnPlayerKeyStateChange

827
Fórum Archívum (Témák/Fórumok) / SA-MP Forráskód
« Dátum: 2012. március 10. - 01:42:33 »
Érdekes, a fõoldalon lévõ link az megy  ::|

828
Pluginok és Programok / YSF - kurta999\'s version
« Dátum: 2012. március 09. - 22:43:37 »
Kicsit módosítottam az AddServerRule()-n, bár ez nem valami nagy cucc.
Példa:
 

#include <a_samp>
enum CON_VARTYPE {CON_VARTYPE_FLOAT, CON_VARTYPE_INT, CON_VARTYPE_BOOL, CON_VARTYPE_STRING};
#define CON_VARFLAG_DEBUG      1   // Debug.. Ahogy a 0.2x-es forráskódba elnézem, ennek semmi értelme.
#define CON_VARFLAG_READONLY   2   // Csak olvasásra, azaz nem jelenik meg a kliensben a szerver rule listán.
#define CON_VARFLAG_RULE      4   // Megjelentik a játékos kliensében a szerver rule listán.
/////////////////////////////////////////////////////////////////////
native AddServerRule(name[], value[], VarFlags = CON_VARFLAG_RULE, VarChangeFunc = 0/*Ne módosítsd ezt! Törölni is fogom mert ennek így értelme nincs, csak crahel tõle*/);
native SetServerRule(name[], value[]);
//native ModifyVariableFlags(name[], VarFlags); // Még NEM jó!
native SetModeRestartTime(Float:seconds);
native DisableJoinMSG();
// native SetPlayerGravity(playerid, Float:Gravity); // Doesn\'t work!
 
public OnFilterScriptInit()
{
AddServerRule(!\"owner\", !\"kurta999\", CON_VARFLAG_READONLY);
AddServerRule(!\"objects\", !\"50000\");
SetServerRule(!\"version\", !\"0.3d R2-YSF\");
SetModeRestartTime(0.2);
new
szObjects[16];
GetServerVarAsString(!\"owner\", szObjects, 32);
printf(\"Owner: %s\", szObjects);
GetServerVarAsString(!\"objects\", szObjects, 32);
printf(\"Objects: %s\", szObjects);
GetServerVarAsString(!\"version\", szObjects, 32);
printf(\"Version: %s\", szObjects);
return 1;
}

 
Letöltés: Klikk

829
Fórum Archívum (Témák/Fórumok) / SA-MP Forráskód
« Dátum: 2012. március 09. - 22:21:20 »
Idézetet írta: Hun_Norberto date=1331327962\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"7610\" data-ipsquote-contentclass=\"forums_Topic
Már a 0.2.5-ben is volt HTTP cuccos? :D
 
Az csak a crash report-ra volt, legalábbis én azt hoztam ki belõlle.
Egyébként van benne pár érdekes dolog :D

830
Pluginok és Programok / YSF - kurta999\'s version
« Dátum: 2012. március 09. - 08:20:53 »
Idézetet írta: lackos888 date=1331189193\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"14428\" data-ipsquote-contentclass=\"forums_Topic
0.3d R2-re megcsined kurta? :P
 
A sima R2 500 játékos verzióra nincs tervbe.
R2 800 játékos verzióra elérhetõ, de arra is csak windowsra.
Következõre 0.3e-re fogom újítani, aztán a Linux verziót is megpróbálom csak ott az a baj, hogy én Linux-on nem tudom lecompliezni, mert nem értek hozzá.

831
SA-MP: verziók / SA-MP 0.3e client/server (Már megjelent)
« Dátum: 2012. március 08. - 18:37:03 »
\" post=\"236130\" timestamp=\"1331225379\"]
Miez a InterpolateCamera...?
 
[/quote]
Tudod rendesen mozgatni a kamerát egy megadott helyrõl egy megadott helyre.
A sebességet is betudod állítani ms-ben, olyasmi, mint a MoveObject()
 

Srácok, a 0.3d-s szevereket viszi?? :O
 
[/quote]
0.3e-s kliensel nem tudsz 0.3d-s szerverre csatlakozni és fordítva se!
De ha frissíted a szervered verzióját, akkor viszi, bár ezt a kérdést nem igazán értettem.

832
SA-MP: verziók / SA-MP 0.3e client/server (Már megjelent)
« Dátum: 2012. március 08. - 06:44:54 »
Igen, ennek énis nagyon örülök!
Ideje volt.
Most már csak arra kell várni, hogy Incognito frissítse a streamert :D

833
SA-MP: Szerverfejlesztés / IsPlayerInWater
« Dátum: 2012. március 07. - 20:17:51 »
kurtus az anyád picsája! :D
Amúgy ne engem dícsérjetek, nem én csináltam.
Majd megpróbálom valahogy az aréna szerinti ellenõrzést megoldani, az mégis csak többet érne, mint ez.

834
Pluginok és Programok / YSF - kurta999\'s version
« Dátum: 2012. március 06. - 20:12:10 »
Idézetet írta: Hun_Norberto date=1331057229\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"14428\" data-ipsquote-contentclass=\"forums_Topic


Benne van a SAMP Licenseben, hogy tilos hamis adatot küldeni a kliesnek és ezt pont azt csinálja.
 
A CreatePlayerObject nem ilyen elven mûködik?
 
[/quote]
Arra van alapból függvény, de ha te akarsz csak külön adatot küldeni a játékosnak, az lényegibe már hamis adat és megszegi a szabályzatot.
Bár ha csak SetPlayerGravity()-t használnál, vagy egyéb ilyen apró marhaságot, azzal szerintem nem problémáznának..
Amúgy majd frissítem 0.3e-re a megjelenés után!
A frissítés mûveletét is leírhatom, mivel ehhez tudomány nem igazán kell :D (A SetServerRule, AddServerRule-re értem)

835
Segítségkérés / Mysql HIBA. Nem indul a szerver...
« Dátum: 2012. március 06. - 16:26:00 »
Esetleg tudnál adni valami bõvebb információkat a módról meg a MySQL pluginról (Meik fajta, hányas verzió, ki csinálta)?

836
Pluginok és Programok / Streamer Plugin v2.7.7
« Dátum: 2012. március 06. - 16:24:23 »
Sajnos nincs.
GetFloatData()-val le tudod kérdeni az aréa pontjait és pawnban pedig megnézed, hogy benne-e van.
Egykébként ezzel kapcsolatban fogok írni Incognito-nak, hogy megcsinálhtná.
Meg ráférne egy frissítés a 0.3e-ben lévõ OnPlayerSelectObject() callbackhoz.

837
Függvények / GetPVarsUpperIndex(playerid)
« Dátum: 2012. március 05. - 21:52:54 »
Amelyiknek a legnagyobb az ID-je, azt értem alatta.
Például ha te létrehozol 150 objectot, akkor a 150 lesz a legmagasabb ID.
De ha törlöd a 20-tól 30-ig, még akkor is azlesz.
Ittvan rá egy példa parancs, ami kilistázza neked az összes létezõ PVar-t.
Ebben van használva mind a három speciális funkció.
 

CMD:pvar(playerid, params[])
{
if(isnull(params)) player1 = playerid;
else if(sscanf(params, \"u\", player1)) return SendClientMessage(playerid, COLOR_RED, \"HASZNÁLAT: /pvar {\" #XCOLOR_YELLOW \"}<Játékos ID/Név>\");
if(player1 == INVALID_PLAYER_ID) return SendClientMessage(playerid, COLOR_RED, MSG_NOT_CONNECTED);
new
MaxID = GetPVarsUpperIndex(player1);
dline[0] = EOS;
for(new i; i < MaxID; i++)
{
if(!GetPVarNameAtIndex(player1, i, country, sizeof(country))) continue;
// print(country);
if(!i)
{
   switch(GetPVarType(player1, country))
   {
      case PLAYER_VARTYPE_STRING:
      {
         GetPVarString(player1, country, i_str, sizeof(i_str));
         format(dline, sizeof(dline), \"%s = %s\", country, i_str);
      }
      case PLAYER_VARTYPE_INT:
      {
         format(dline, sizeof(dline), \"%s = %d\", country, GetPVarInt(player1, country));
      }
      case PLAYER_VARTYPE_FLOAT:
      {
         format(dline, sizeof(dline), \"%s = %f\", country, GetPVarFloat(player1, country));
      }
   }
}
else
{
   switch(GetPVarType(player1, country))
   {
      case PLAYER_VARTYPE_STRING:
      {
         GetPVarString(player1, country, i_str, sizeof(i_str));
         format(dline, sizeof(dline), \"%s\\n%s = %s\", dline, country, i_str);
      }
      case PLAYER_VARTYPE_INT:
      {
         format(dline, sizeof(dline), \"%s\\n%s = %d\", dline, country, GetPVarInt(player1, country));
      }
      case PLAYER_VARTYPE_FLOAT:
      {
         format(dline, sizeof(dline), \"%s\\n%s = %f\", dline, country, GetPVarFloat(player1, country));
      }
   }
}
}
format(i_str, sizeof(i_str), \"PVarLista {%06x}%s(%d) {\" #XCOLOR_WHITE \"}<%d>\", GetPlayerColor(player1) >>> 8, pName(player1), player1, MaxID);
ShowPlayerDialog(playerid, 5000, DIALOG_STYLE_LIST, i_str, dline, !\"Oké\");
return 1;
}

838
SA-MP: verziók / SA-MP 0.3e client/server (Már megjelent)
« Dátum: 2012. március 05. - 21:03:26 »
Idézetet írta: DaVe date=1330976515\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"18030\" data-ipsquote-contentclass=\"forums_Topic
Félrefordítás: a kamera mozgás nem teleport szerû. Lehetõség van azonnal kamera állás váltásra és a kamera mozgatására, ezért van fölötte a 2 definíció.
Illetve két mondatot nem fordítottál:
Az elõzõ kiadás több apró hibát tartalmazott mely a szerver speciális eszközökkel való támadását tette lehetõvé.
A hibák javítása szerver és kliens oldali frissítést is igényel.
Egyébként az object editoron kívül a fejlestések szerintem bozasztóan feleslegesek az átlag felhasználó számára :)
 
Szerintem nem azok, de nem nagy jelentõségûek, de jók lesznek.
Kösz, hogy kijavítottál, amúgy azért nem fordítottam még le, mert gondoltam holnapra hagyom :D

839
Segítségkérés / Random változó
« Dátum: 2012. március 05. - 20:05:48 »
\" post=\"234943\" timestamp=\"1330974085\"]

 

new const
g_iWheels[17] =
{
1025, 1073, 1074, 1075, 1076,
1077, 1078, 1079, 1080, 1081,
1082, 1083, 1084, 1085, 1096,
1097, 1098
};
// Aztán valahova..
AddVehicleComponent(vehicleid, g_iWheels[random(sizeof(g_iWheels))]); // Csak példa
printf(\"Random Wheel: %d\", g_iWheels[random(sizeof(g_iWheels))]);

 

[/quote]
Szintén rossz. Már megoldottam neki privátba, csak teszteli.
 
[/quote]
Miért lenne rossz?
Így használom, használtam mindig is és nekem megy.

840
Segítségkérés / Random változó
« Dátum: 2012. március 05. - 19:48:28 »

new const
g_iWheels[17] =
{
1025, 1073, 1074, 1075, 1076,
1077, 1078, 1079, 1080, 1081,
1082, 1083, 1084, 1085, 1096,
1097, 1098
};
// Aztán valahova..
AddVehicleComponent(vehicleid, g_iWheels[random(sizeof(g_iWheels))]); // Csak példa
printf(\"Random Wheel: %d\", g_iWheels[random(sizeof(g_iWheels))]);

Oldalak: 1 ... 54 55 [56] 57 58 ... 184
SimplePortal 2.3.7 © 2008-2024, SimplePortal