hlmod.hu

Magyar Half-Life Mód közösség!
Pontos idő: 2024.03.28. 10:34



Jelenlévő felhasználók

Jelenleg 233 felhasználó van jelen :: 0 regisztrált, 0 rejtett és 233 vendég

A legtöbb felhasználó (1565 fő) 2020.11.21. 11:26-kor tartózkodott itt.

Regisztrált felhasználók: nincs regisztrált felhasználó az elmúlt 5 percben aktív felhasználók alapján

Utoljára aktív
Ahhoz hogy lásd ki volt utoljára aktív, be kell jelentkezned.



Az oldal teljeskörű
használatához regisztrálj.

Regisztráció

Kereső


Új téma nyitása  Hozzászólás a témához  [ 21 hozzászólás ]  Oldal 1 2 3 Következő
Szerző Üzenet
 Hozzászólás témája: Kés Rendszer v2
HozzászólásElküldve: 2016.01.03. 23:06 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2015.04.10. 19:49
Hozzászólások: 610
Megköszönt másnak: 53 alkalommal
Megköszönték neki: 147 alkalommal
Kés Rendszer
v2.0.0 by Akosch:.


Mire is jó ez a plugin? Mivel jobb mint a többi hasonló?
Marha egyszerű szerkeszthetőséget nyújt, amellett hogy nem igényel semmilyen pawn -al kapcsolatos hozzáértést. A késeket egy külön fájlban tudod megírni / szerkeszteni, a szinteket / fejlődést szintúgy, illetve a boltot külső pluginnal tudod létrehozni ( amíg nincs legalább 1 áru leregisztrálva a boltba, addig meg se jelenik ) / bővíteni.

Használata, beállítások:
Először is tekintsünk a nyelvi fájlba, ez az alapja a betöltésnek, itt van lehetőségünk szerkeszteni, h mi milyen szavakat szeretnénk használni a kések képességeinek betöltéséhez.
Kód:
KEY1 = VMODEL
KEY2 = PMODEL
KEY3 = SEBESSEG
KEY4 = GRAVITACIO
KEY5 = SEBZES
KEY6 = VISSZALOKES
KEY7 = ELET
KEY8 = LATHATOSAG
KEY9 = SZINT

Innen szerintem mindenkinek egyértelmű, h melyik nyelvi kulcs melyik képességhez tartozó szót állítja.
Kések megadási formátuma a cstrike/addons/amxmodx/configs/knives.txt fájlban:

Kés neve szögletes zárójelek közt. ( [Késem Neve] ) Majd alatta a nyelvi fájlban megadott szavakkal a képességek beállítása, első a megadott szó majd egy egyenlőség jel aztán az érték. ( ELET = 55 ).

KEY1 ( VMODEL ): Itt adhatjuk meg a tulajdonos és a nézők számára látható model ( v_* ) elérési útját, kezdődően a models mappától, de amennyiben marha lusta vagy a "models/" részt pótolja a plugin, illetve a .mdl kiterjesztést is pótolja, ha véletlen lehagynád.

KEY2 ( PMODEL ): A többi játékos számára látható model ( p_* ), ugyanaz mint az előbbinél.

KEY3 ( SEBESSEG ): Itt adhatjuk meg, hogy milyen gyorsan tudjunk mozogni a késünkkel, nagyobb érték esetén szükséges lehet állítani az sv_maxspeed szerver cvaron, alapból tört érték, de amennyiben neked ez nem tetszik megadhatod egész számként is, a plugin pótolja. ( Alapérték: 250.0 )

KEY4 ( GRAVITACIO ): Itt adhatjuk meg, hogy a késsel mekkorát lehessen ugrani, alacsonyabb érték nagyobb ugrást jelent, nagyobb érték pedig kisebb ugrást, szintén alapból tört érték, de itt is elhagyható a tört rész. ( Alapérték: 800, ez a szerveren lévő alap is )

KEY5 ( SEBZES ): Itt adhatjuk meg, hogy az alap sebzéshez még mennyit kapjon, aki ezt a kést választja, ugyanúgy tört érték... ( Alapérték: 0.0, normál sebzés[ kicsi: 15, nagy: 65 ] )

KEY6 ( VISSZALOKES ): Itt adhatjuk meg, hogy a megsebzett ellenfelünket milyen erővel lökjük vissza ezzel a késsel, egész érték. ( Alapérték: 0, normál eset, nincs visszalökés )

KEY7 ( ELET ): Itt adhatjuk meg, hogy ezzel a késsel mennyi életet kapjon pluszba a játékos az adott mapon, plusz infó: 1hp-s és 35hp-s mapokon fixálja a plugin a hp bugokat a többin pedig 100 hp-t kapsz + amit a késed ad és a 256/0 hp-s bug is javítva. ( Alapérték: 0, alap kezdő élet )

KEY8 ( LATHATOSAG ): Itt adhatjuk meg, hogy mennyire legyen látható a játékosunk 0 - láthatatlan, 255 - teljesen látható. ( Alapérték: 255 )

KEY9 ( SZINT ): Itt adhatjuk meg, hogy hányas szinttől legyen elérhető a késünk. ( Alapérték: 0 )

Két példa:
Kód:
[ALAP]

Ez így létrehoz egy totál alap kést alap néven.

Kód:
[Szuper kés]
SEBESSEG = 500
GRAVITY = 400
LATHATOSAG = 127
SZINT = 200

Ez létrehoz egy kést amivel dupla olyan gyors vagy és dupla akkorát ugrasz + félig láthatatlan is vagy, mindez 200-as szinttől elérhető.

A fejlődés nehézségét is teljesen be tudjuk állítani a cvarok és a cstrike/addons/amxmodx/configs/levels.txt segítségével.

Levels.txt fájlban:
Van lehetőségünk egyesével megadni minden szinthez a szükséges tapasztalatot, de ebben a verzióban már megoldottam, h tudj megadni egy intervallumot ami közt fixen növeli a szükséges tapasztalatot a megadott értékkel.
Intervallum megadása:
Hányas szinttől, vessző, hányas szintig, három pont, mennyivel. ( x, y... z )
Példa:
Kód:
50
1, 50... 100
7500
52, 75... 150

Így 50 tapasztalat szükséges az első szinthez, majd a 2. -tól az 50. szintig folyamatosan nő ez a szám százzal, utána az 51 -es szinthez 7500 tapasztalat kell, majd az 52 -es szinttől a 75. szintig folyton nő ez a szám 150 -el.

Cvarok:
kill_msgs ( 0 - ki, 1 - csak a gyilkos, 2 - az áldozat is ) - Adjon-e chat üzenetet arról, h ki ölt meg és mit kaptál ezért.
kill_xp ( 0 - felfele ) - Mennyi tapasztalat járjon egy sima ölésért.
kill_point ( 0 - felfele ) - Mennyi pont járjon egy sima ölésért.
hs_xp ( 0 - felfele ) - Mennyi tapasztalat járjon egy fejes ölésért.
hs_point ( 0 - felfele ) - Mennyi pont járjon egy fejes ölésért.

A dinamikus tömböknek köszönhetően többé nincs szükségünk szórakozni a konstansokkal.

Mentés:
Alapból nvault mentést használ a plugin, de ha kivesszük a a kettő dőlt vonalat ennek a sornak az elejéről:
  1. //#define SQL

Akkor a megadott adatbázisba ment.
  1. new const g_sSQL_INFOS[ ][ ] =
  2. {
  3.     "127.0.0.1",
  4.     "USERNAME",
  5.     "PASSWORD",
  6.     "DATABASE",
  7. }


Mellék pluginok készítése, egyebek:

Mivel az egész plugin szinte újraírtam gondoltam most már készítek hozzá bővíthetőségi lehetőséget, csináltam többi forwardot és native -t, ezek részletesebben le vannak írva a .inc kiterjesztésű fájlban, csak a boltra térnék ki, egy példával:

  1. #include < amxmodx >
  2. #include < fun >
  3. #include < KnifeSystem >
  4.  
  5. new g_iAruId;
  6.  
  7. public plugin_init()
  8. {
  9.     register_plugin( "[KS]Bolt", "1.0.0", "Akosch:." );
  10.    
  11.     g_iAruId = ks_register_item( "+50hp", "fnBolt", 75 ); // Az áru neve a menüben "+50hp" lesz, és 75 pontba fog kerülni.
  12. }
  13.  
  14. public fnBolt( iJatekosId, iAruId ) // A függvény ami meghívódik, ha valaki megvette az árut ( public kulcsszó kötelező! ).
  15. {
  16.     if ( g_iAruId == iAruId ) // Ez az ellenörzés elhanyagolható, ha csak 1 árut regisztrálsz le egy függvényhez.
  17.     {
  18.         set_user_health( iJatekosId, get_user_health( iJatekosId ) + 50 ); // Megadjuk a pénzéért ami jár.
  19.         client_print_color( iJatekosId, iJatekosId, "Vettél +50hp-t!" );
  20.     }
  21. }

Majd ha lesz úgy időm lehet csinálok 1 - 2 ilyen egyszerűbb plugint ehhez, de ha más is szeretne hozzá készíteni és esetleg elakadna vagy hiányzik neki valami funkció, segítség kéne bátran keressen.

A szerver prefix ebben a sorban módosítható:
  1. new const g_sPREFIX[ ] = "[A:.]";


A pont addolás menühöz szükséges jog itt módosítható:
  1. const g_iADD_FLAG = ADMIN_CVAR;


Színezéseken a nyelvi fájlban tudsz módosítani; igen a chates színezéseken is az 1.8.3-as amxmodx -nek köszönhetően.

Információk!
1.8.3 -as amxmodx szükséges a pluginhoz!!!
- Nem szükséges minden képesség megadása, amennyiben valamit kihagysz az alapérték érvényesül.
- A nyelvi fájlban megadott szavakat ( KEY* -nél ) használhatod kis és nagy betűs változatban is a knives.txt fájlban.
- A modelek mindenképp legyenek a megadott helyükön! ( Ha lehagyod a "models/" részt akkor is ott legyen )
- Ha hiányzik a levels.txt vagy a knives.txt vagy probléma adódik a mentésben akkor dob egy hibaüzenetet.
- Ha helytelenül adod meg a szintekhez szükséges tapasztalatot, akkor futás közbeni hibát fog dobni ( runtime error ).
- Direkt mellékeltem üres fájlokat, nem véletlen készítettem ilyenre a plugint.
- Ha találnál valamilyen hibát, akkor azt jelezd itt, pm-ben esetleg nyiss vele témát és javítjuk!


Mivel jobb az előzőhöz képest:
Egyszerűbb, átláthatóbb kés és szint beállítás.
Teljes mértékben testreszabható bolt.
Több nyelvű menü, chat üzenetek.
Ismert hibák, bugok javításra kerültek.
Optimalizáltabb kód.

AMX Mod X Compiler 1.8.3-dev+4976
Copyright (c) 1997-2006 ITB CompuPhase
Copyright (c) 2004-2013 AMX Mod X Team

Header size: 2960 bytes
Code size: 32868 bytes
Data size: 11244 bytes
Stack/heap size: 16384 bytes
Total requirements: 63456 bytes
Done.

Megj.: Új fordító figyelmeztetést dobhat, h client_disconnected helyett még a régi client_disconnect forwardot használtam, de ez nem jelent problémát, mivel nem client_connect -nél töltök be.

Tesztelve csak localon volt, de nem találtam hibát, ha megfelelően állítottam be.

_________________
Néha itt, de többször nem.

Ők köszönték meg Akosch:. nek ezt a hozzászólást (összesen 5): kiki (2016.01.06. 17:47) • LyleChriss (2016.01.08. 19:38) • FonoK (2016.01.24. 00:36) • kengurumancs (2016.01.25. 18:39) • kid.buu^ (2016.01.26. 22:12)
  Népszerűség: 11.36%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.01.03. 23:35 
Offline
Tag
Avatar

Csatlakozott: 2015.12.29. 21:29
Hozzászólások: 40
Megköszönt másnak: 4 alkalommal
Megköszönték neki: 3 alkalommal
Grat Nagyon szep forraskod :)

_________________
  1. new const PLUGIN[] = "";
  2. new const VERSION[] = "1.0";
  3. new const AUTHOR[] = "CoCo";


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.01.03. 23:57 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2015.04.10. 19:49
Hozzászólások: 610
Megköszönt másnak: 53 alkalommal
Megköszönték neki: 147 alkalommal
Egyenlőre kérném, hogy ne hagyjátok jóvá, hátha valaki unalmában csinál más nyelvre fordítást ( vagy az angolon javít xd ), vagy kipróbálja szerveren és jön elő probléma. + Ha lenne ötlet egyes kódrészletek javítására / plugin bővítésére akkor várom az ötleteket.

_________________
Néha itt, de többször nem.


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.01.04. 14:36 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.03.07. 14:55
Hozzászólások: 939
Megköszönt másnak: 38 alkalommal
Megköszönték neki: 95 alkalommal
Egyenlőre nem is tud senki sem jóváhagyni,ezt úgy mellékesen leirom :)

_________________
Hmm.
Kép


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.01.04. 17:59 
Offline
Nagyúr
Avatar

Csatlakozott: 2014.11.16. 12:37
Hozzászólások: 686
Megköszönt másnak: 32 alkalommal
Megköszönték neki: 131 alkalommal
3 fajta fordítón is kipróbáltam ;)
Kód:
asd.sma(45) : error 017: undefined symbol "MAX_PLAYERS"
asd.sma(45) : error 009: invalid array size (negative or zero)
asd.sma(46) : error 017: undefined symbol "MAX_PLAYERS"
asd.sma(58) : error 017: undefined symbol "Ham_CS_Player_ResetMaxSpeed"
asd.sma(58) : warning 215: expression has no effect
asd.sma(58) : warning 215: expression has no effect
asd.sma(58) : warning 215: expression has no effect
asd.sma(58) : warning 215: expression has no effect
asd.sma(58) : error 001: expected token: ";", but found ")"
asd.sma(58) : error 029: invalid expression, assumed zero
asd.sma(58) : fatal error 107: too many error messages on one line

Compilation aborted.
7 Errors.
Could not locate output file asd.amx (compile failed).

_________________
Kép
"I wouldn't hold my breath if I was you
Cause I'll forget but I'll never forgive you
Don't you know, don't you know?
True friends stab you in the front."


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.01.04. 18:02 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2015.04.10. 19:49
Hozzászólások: 610
Megköszönt másnak: 53 alkalommal
Megköszönték neki: 147 alkalommal
Lehet nem tartottál ki a leírás végéig, ott leírtam + látni a fordítón, h 1.8.3-as amxmodxhez írtam.

"1.8.3 -as amxmodx szükséges a pluginhoz!"
"AMX Mod X Compiler 1.8.3-dev+4976"

_________________
Néha itt, de többször nem.


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.01.06. 17:43 
Offline
Nagyúr
Avatar

Csatlakozott: 2014.11.16. 12:37
Hozzászólások: 686
Megköszönt másnak: 32 alkalommal
Megköszönték neki: 131 alkalommal
Akosch:. írta:
Lehet nem tartottál ki a leírás végéig, ott leírtam + látni a fordítón, h 1.8.3-as amxmodxhez írtam.

"1.8.3 -as amxmodx szükséges a pluginhoz!"
"AMX Mod X Compiler 1.8.3-dev+4976"


Hát igen egy ilyen fajta Ákos féle leírásnál örülök ha a feléig eljutok :D

_________________
Kép
"I wouldn't hold my breath if I was you
Cause I'll forget but I'll never forgive you
Don't you know, don't you know?
True friends stab you in the front."


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.01.06. 22:26 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2014.09.08. 22:21
Hozzászólások: 3014
Megköszönt másnak: 96 alkalommal
Megköszönték neki: 555 alkalommal
Mivel jóváhagyás nélkül nem látják, így elfogadom és szólsz ha van valami :D

_________________
GitHub - mforce

Ők köszönték meg mforce nek ezt a hozzászólást: Akosch:. (2016.01.07. 17:26)
  Népszerűség: 2.27%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.01.07. 17:23 
Offline
Tiszteletbeli
Avatar

Csatlakozott: 2015.04.10. 19:49
Hozzászólások: 610
Megköszönt másnak: 53 alkalommal
Megköszönték neki: 147 alkalommal
v2.0.1
bind_pcvar_num, strtok2 és ArrayGetStringHandle bevezetése.

v2.1.0
új funkciók:
- ks_add_xp konzol parancs tapasztalat addoláshoz
- mostantól a plugin kiolvassa a map nevéből, hogy mennyi a kezdő hp -> a map nevében a "hp" szó előtt kell lennie a számnak amit kezdő életnek akarunk
- új, stabilabb számítás a visszalökéshez

új nativek:
- ks_set_player_info - az adott játékos infó értékét állíthatjuk vele
- ks_register_item_callback - lehetőséget ad egy áruhoz tartozó callback létrehozására, teljesen testreszabható az árunk a boltban

native bővítés:
- ks_register_item - új, 4. paraméter, ha joghoz szeretnénk kötni az áru megvételét

optimalizálások:
- egyszerűbb betöltés
- fun és fakemeta modul kivéve
- egyszerűbb ciklusok a játékosok kilistázásához menübe ( nem kell fölösleges változókat létrehozni, native -t hívni )
- pár függvény átgondolva

sma:
  1. /* Plugin generated by AMXX-Studio
  2.  
  3. Changelog
  4.     v1.0.0 - Alap ötlet megvalósítása, macerás használat, kisebb hibák.
  5.  
  6.     v2.0.0 - Egész plugin újraírva, gondolva: jobb kelezhetőség, új mentés, bővíthető mellékpluginokkal.
  7.         v2.0.1 - Kisebb optimalizálások.
  8.         v2.1.0 - Pár dolog újra gondolva, fakemeta / fun modul feleslegessé vált, kivéve.
  9. */
  10.  
  11. #include < amxmisc >
  12. #include < amxmodx >
  13. #include < engine >
  14. #include < hamsandwich >
  15.  
  16. #define IS_PLAYER(%0) ( 0 < ( %0 ) < MaxClients )
  17. //#define SQL
  18.  
  19. #if defined SQL
  20.     #include < sqlx >
  21.     new const g_sSQL_INFOS[ ][ ] =
  22.     {
  23.         "127.0.0.1",
  24.         "USERNAME",
  25.         "PASSWORD",
  26.         "DATABASE"
  27.     }
  28.     new Handle:g_iSqlTuple;
  29. #else
  30.     #include < nvault >
  31.     new const g_sNVAULTNAME[ ] = "PlayerDatas";
  32.     new g_iNvaultId;
  33. #endif
  34.  
  35. enum _:ePlayerInfos
  36. {
  37.     iPlayerLvl,
  38.     iPlayerXp,
  39.     iPlayerPoints,
  40.     iPlayerSelected
  41. };
  42.  
  43. new const g_sPLUGIN[ ] = "KnifeSystem";
  44. new const g_sVERSION[ ] = "2.1.0";
  45. new const g_sAUTHOR[ ] = "Akosch:.";
  46. new const g_sPREFIX[ ] = "[A:.]";
  47.  
  48. const g_iADD_FLAG = ADMIN_CVAR;
  49.  
  50. new Array:g_daKnives[ 10 ], Array:g_daLevels, Array:g_daItemName, Array:g_daItemAccess;
  51. new Array:g_daItemCallback, Array:g_daItemFuncId, Array:g_daItemPluginId, Array:g_daItemCost;
  52. new g_iPlayerInfos[ MAX_PLAYERS + 1 ][ ePlayerInfos ], g_iTarget[ MAX_PLAYERS + 1 ];
  53. new g_sPlayerName[ MAX_PLAYERS + 1 ][ MAX_NAME_LENGTH ], g_iForwards[ 3 ];
  54. new g_iCvarKillMsgs, g_iCvarKillPts, g_iCvarKillXp, g_iCvarHsPts, g_iCvarHsXp;
  55. new g_iPlayerConnected, Float:g_fMap = 100.00;
  56.  
  57. public plugin_natives( )
  58. {
  59.     register_native( "ks_register_item", "@naRegItem" );
  60.     register_native( "ks_register_item_callback", "@naRegItemCallback" );
  61.     register_native( "ks_set_player_info", "@naSetPlayerInfo" );
  62.     register_native( "ks_get_player_info", "@naGetPlayerInfo" );
  63.     register_native( "ks_get_knife_info", "@naGetKnifeInfo" );
  64.     register_native( "ks_get_max_level", "@naGetMaxLvl" );
  65. }
  66.  
  67. public plugin_init( )
  68. {
  69.     RegisterHam( Ham_CS_Player_ResetMaxSpeed, "player", "@fwResetMaxSpeedPost", 1, true );
  70.     RegisterHam( Ham_TakeDamage, "player", "@fwTakeDamage", 0, true );
  71.     RegisterHam( Ham_Item_Deploy, "weapon_knife", "@fwWeaponKnifePost", 1, true );
  72.     RegisterHam( Ham_Spawn, "player", "@fwPlayerSpawnPost", 1, true );
  73.  
  74.     register_message( get_user_msgid( "Health" ), "@evHealthPre" );
  75.  
  76.     register_event( "DeathMsg", "@evDeathPost", "a" );
  77.  
  78.     register_clcmd( "drop", "@fnShowMenu" );
  79.     register_clcmd( "say /menu", "@fnShowMenu" );
  80.     register_clcmd( "GIFT", "@fnGiftHandler" );
  81.     register_clcmd( "ADD", "@fnAddHandler" );
  82.  
  83.     register_concmd( "ks_add_xp", "@fnAddXp", g_iADD_FLAG, "< targetname > < xp to add >" );
  84.  
  85.     g_iForwards[ 0 ] = CreateMultiForward( "ks_level_up", ET_IGNORE, FP_CELL, FP_CELL );
  86.     g_iForwards[ 1 ] = CreateMultiForward( "ks_max_lvl_reached", ET_IGNORE, FP_CELL );
  87.     g_iForwards[ 2 ] = CreateMultiForward( "ks_knife_selected", ET_IGNORE, FP_CELL, FP_CELL );
  88.  
  89.     bind_pcvar_num( register_cvar( "kill_msgs", "0" ), g_iCvarKillMsgs );
  90.     bind_pcvar_num( register_cvar( "kill_xp", "1" ), g_iCvarKillXp );
  91.     bind_pcvar_num( register_cvar( "kill_point", "1" ), g_iCvarKillPts );
  92.     bind_pcvar_num( register_cvar( "hs_xp", "3" ), g_iCvarHsXp );
  93.     bind_pcvar_num( register_cvar( "hs_point", "2" ), g_iCvarHsPts );
  94.  
  95.     new sMapName[ 32 ];
  96.     get_mapname( sMapName, charsmax( sMapName ) );
  97.  
  98.     if ( replace( sMapName, charsmax( sMapName ), "hp", "^0" ) )
  99.         g_fMap = str_to_float( sMapName );
  100.  
  101. #if defined SQL
  102.     g_iSqlTuple = SQL_MakeDbTuple( g_sSQL_INFOS[ 0 ], g_sSQL_INFOS[ 1 ], g_sSQL_INFOS[ 2 ], g_sSQL_INFOS[ 3 ] );
  103.  
  104.     new sThread[ 256 ];
  105.     formatex( sThread, charsmax( sThread ), "CREATE TABLE IF NOT EXISTS `KnifeSystem` (`SteamId` varchar( 32 ) NOT NULL, `Level` INT( 11 ) NOT NULL, `Xp` INT( 11 ) NOT NULL, `Points` INT( 11 ) NOT NULL, `Selected` INT( 11 ) NOT NULL, `id` INT( 11 ) NOT NULL AUTO_INCREMENT PRIMARY KEY )" );
  106.  
  107.     SQL_ThreadQuery( g_iSqlTuple, "@fnThreadHandler", sThread );
  108. #else
  109.     g_iNvaultId = nvault_open( g_sNVAULTNAME );
  110.  
  111.     if ( g_iNvaultId == INVALID_HANDLE )
  112.         set_fail_state( "%L", LANG_SERVER, "INVALIDNVAULTID" )
  113. #endif
  114. }
  115.  
  116. public plugin_precache( )
  117. {
  118.     register_dictionary( "KnifeSystem.txt" );
  119.     register_plugin( g_sPLUGIN, g_sVERSION, g_sAUTHOR );
  120.  
  121.     g_daKnives[ 0 ] = ArrayCreate( 32 );
  122.     g_daKnives[ 1 ] = ArrayCreate( 32 );
  123.     g_daKnives[ 2 ] = ArrayCreate( 32 );
  124.     g_daKnives[ 3 ] = ArrayCreate( 1 );
  125.     g_daKnives[ 4 ] = ArrayCreate( 1 );
  126.     g_daKnives[ 5 ] = ArrayCreate( 1 );
  127.     g_daKnives[ 6 ] = ArrayCreate( 1 );
  128.     g_daKnives[ 7 ] = ArrayCreate( 1 );
  129.     g_daKnives[ 8 ] = ArrayCreate( 1 );
  130.     g_daKnives[ 9 ] = ArrayCreate( 1 );
  131.  
  132.     g_daItemName = ArrayCreate( 32 );
  133.     g_daItemPluginId = ArrayCreate( 1 );
  134.     g_daItemFuncId = ArrayCreate( 1 );
  135.     g_daItemCost = ArrayCreate( 1 );
  136.     g_daItemAccess = ArrayCreate( 1 );
  137.     g_daItemCallback = ArrayCreate( 1 );
  138.  
  139.     g_daLevels = ArrayCreate( 1 );
  140.  
  141.     new sBuffer[ 128 ], sFile[ 64 ], pFile;
  142.     get_localinfo( "amxx_configsdir", sFile, charsmax( sFile ) );
  143.     add( sFile, charsmax( sFile ), "/knives.txt" );
  144.  
  145.     pFile = fopen( sFile, "rt" );
  146.  
  147.     if ( pFile )
  148.     {
  149.         new sKey[ 64 ], sValue[ 64 ], sKEYS[ sizeof ( g_daKnives ) ][ 32 ];
  150.         new iSize, iSize2, i;
  151.         new const sDefValues[ ][ ] =
  152.         {
  153.             { "models/v_knife.mdl" }, { "models/p_knife.mdl" }
  154.         };
  155.         new const Float:fDefValues[ ] = { 250.00, 1.00, 0.00, 0.00, 0.00 };
  156.         new const iDefValues[ ] = { 255, 0 };
  157.  
  158.         for ( i = 1; i < sizeof ( sKEYS ); ++i )
  159.         {
  160.             formatex( sKEYS[ i ], charsmax( sKEYS[ ] ), "KEY%i", i );
  161.             formatex( sKEYS[ i ], charsmax( sKEYS[ ] ), "%L", LANG_SERVER, sKEYS[ i ] );
  162.         }
  163.        
  164.         while ( !feof( pFile ) )
  165.         {
  166.             fgets( pFile, sBuffer, charsmax( sBuffer ) );
  167.             trim( sBuffer );
  168.            
  169.             if ( sBuffer[ 0 ] == '/' || sBuffer[ 0 ] == ';' || !sBuffer[ 0 ] )
  170.                 continue;
  171.            
  172.             if ( sBuffer[ 0 ] == '[' )
  173.             {
  174.                 iSize = ArraySize( g_daKnives[ 0 ] );
  175.        
  176.                 for ( i = 1; i < sizeof ( g_daKnives ); ++i )
  177.                 {
  178.                     iSize2 = ArraySize( g_daKnives[ i ] );
  179.                    
  180.                     if ( iSize2 < iSize )
  181.                         if ( 0 < i < 3 )
  182.                             ArrayPushString( g_daKnives[ i ], sDefValues[ i - 1 ] );
  183.                         else if ( 2 < i < 8 )
  184.                             ArrayPushCell( g_daKnives[ i ], fDefValues[ i - 3 ] );
  185.                         else
  186.                             ArrayPushCell( g_daKnives[ i ], iDefValues[ i - 8 ] );
  187.                     else if ( iSize2 > iSize )
  188.                         ArrayDeleteItem( g_daKnives[ i ], --iSize2 );
  189.                 }
  190.  
  191.                 sBuffer[ strlen( sBuffer ) - 1 ] = EOS;
  192.                 ArrayPushString( g_daKnives[ 0 ], sBuffer[ 1 ] );
  193.                 continue;
  194.             }
  195.            
  196.             strtok2( sBuffer, sKey, charsmax( sKey ), sValue, charsmax( sValue ), '=', TRIM_FULL );
  197.            
  198.             for ( new i; i < sizeof ( g_daKnives ); ++i )
  199.                 if ( equali( sKEYS[ i ], sKey ) )
  200.                     switch ( i )
  201.                     {
  202.                         case 1, 2: fnArrayPushModel( sValue, charsmax( sValue ), i );
  203.                         case 4: ArrayPushCell( g_daKnives[ i ], ( str_to_float( sValue ) / 800.00 ) );
  204.                         case 8, 9: ArrayPushCell( g_daKnives[ i ], str_to_num( sValue ) );
  205.                         default: ArrayPushCell( g_daKnives[ i ], str_to_float( sValue ) );
  206.                     }
  207.         }
  208.  
  209.         fclose( pFile );
  210.         iSize = ArraySize( g_daKnives[ 0 ] );
  211.  
  212.         for ( i = 1; i < sizeof ( g_daKnives ); ++i )
  213.             {
  214.                 iSize2 = ArraySize( g_daKnives[ i ] );
  215.                
  216.                 if ( iSize2 < iSize )
  217.                     if ( 0 < i < 3 )
  218.                         ArrayPushString( g_daKnives[ i ], sDefValues[ i - 1 ] );
  219.                     else if ( 2 < i < 8 )
  220.                         ArrayPushCell( g_daKnives[ i ], fDefValues[ i - 3 ] );
  221.                     else
  222.                         ArrayPushCell( g_daKnives[ i ], iDefValues[ i - 8 ] );
  223.                 else if ( iSize2 > iSize )
  224.                     ArrayDeleteItem( g_daKnives[ i ], iSize2 - 1 );
  225.             }
  226.     }
  227.     else
  228.     {
  229.         format( sFile, charsmax( sFile ), "%L", LANG_SERVER, "MISSINGFILE", sFile );
  230.         set_fail_state( sFile );
  231.     }
  232.  
  233.     get_localinfo( "amxx_configsdir", sFile, charsmax( sFile ) );
  234.     add( sFile, charsmax( sFile ), "/levels.txt" );
  235.  
  236.     pFile = fopen( sFile, "rt" );
  237.  
  238.     if ( pFile )
  239.     {
  240.         new sData[ 3 ][ 16 ], iNum, iFrom, iTo, iWith, iSize;
  241.  
  242.         while ( !feof( pFile ) )
  243.         {
  244.             fgets( pFile, sBuffer, charsmax( sBuffer ) );
  245.             replace( sBuffer, charsmax( sBuffer ), "^n", "" );
  246.             remove_quotes( sBuffer );
  247.  
  248.             if ( is_str_num( sBuffer ) )
  249.                 ArrayPushCell( g_daLevels, str_to_num( sBuffer ) );
  250.             else
  251.             {
  252.                 replace( sBuffer, charsmax( sBuffer ), "...", " " );
  253.                 replace( sBuffer, charsmax( sBuffer ), ",", " " );
  254.                 parse( sBuffer, sData[ 0 ], charsmax( sData[ ] ), sData[ 1 ], charsmax( sData[ ] ), sData[ 2 ], charsmax( sData[ ] ) );
  255.  
  256.                 iFrom = str_to_num( sData[ 0 ] );
  257.                 iTo = str_to_num( sData[ 1 ] );
  258.                 iWith = str_to_num( sData[ 2 ] );
  259.                 iSize = ArraySize( g_daLevels );
  260.  
  261.                 if ( iFrom > iSize )
  262.                     iFrom = iSize;
  263.  
  264.                 iNum = ArrayGetCell( g_daLevels, iFrom - 1 );
  265.  
  266.                 for ( new i = iFrom; i <= iTo; ++i )
  267.                     ArrayPushCell( g_daLevels, iNum += iWith );
  268.             }
  269.         }
  270.         fclose( pFile );
  271.     }
  272.     else
  273.     {
  274.         format( sFile, charsmax( sFile ), "%L", LANG_SERVER, "MISSINGFILE", sFile );
  275.         set_fail_state( sFile );
  276.     }
  277. }
  278.  
  279. @naRegItem( iPluginId, iParamNum )
  280. {
  281.     new sItemName[ 32 ], sItemFunc[ 32 ], iCost;
  282.    
  283.     get_string( 1, sItemName, charsmax( sItemName ) );
  284.     get_string( 2, sItemFunc, charsmax( sItemFunc ) );
  285.     iCost = get_param( 3 );
  286.  
  287.     if ( iCost < 0 )
  288.         iCost = 0;
  289.  
  290.     ArrayPushString( g_daItemName, sItemName );
  291.     ArrayPushCell( g_daItemPluginId, iPluginId );
  292.     ArrayPushCell( g_daItemFuncId, get_func_id( sItemFunc, iPluginId ) );
  293.     ArrayPushCell( g_daItemCost, iCost );
  294.     ArrayPushCell( g_daItemAccess, get_param( 4 ) );
  295.     ArrayPushCell( g_daItemCallback, -1 );
  296.  
  297.     return ( ArraySize( g_daItemCost ) - 1 );
  298. }
  299.  
  300. @naRegItemCallback( iPluginId, iParamNum )
  301. {
  302.     new iItemId = get_param( 1 );
  303.  
  304.     if ( ArraySize( g_daItemCallback ) > iItemId )
  305.     {
  306.         ArraySetCell( g_daItemCallback, iItemId, get_param( 2 ) );
  307.        
  308.         return 1;
  309.     }
  310.  
  311.     return 0;
  312. }
  313.  
  314. @naGetKnifeInfo( iPluginId, iParamNum )
  315.     if ( 2 < iParamNum < 5 )
  316.     {
  317.         new sKnifeInfo[ 32 ];
  318.         ArrayGetString( g_daKnives[ get_param( 1 ) ], get_param( 2 ), sKnifeInfo, charsmax( sKnifeInfo ) );
  319.         set_string( 3, sKnifeInfo, get_param( 4 ) );
  320.         return 1;
  321.     }
  322.     else
  323.         return ArrayGetCell( g_daKnives[ get_param( 1 ) ], get_param( 2 ) );
  324.  
  325. @naGetPlayerInfo( iPluginId, iParamNum )
  326.     return g_iPlayerInfos[ get_param( 1 ) ][ get_param( 2 ) ];
  327.  
  328. @naGetMaxLvl( iPluginId, iParamNum )
  329.     return ( ArraySize( g_daLevels ) - 1 );
  330.  
  331. @naSetPlayerInfo( iPluginId, iParamNum )
  332.     g_iPlayerInfos[ get_param( 1 ) ][ get_param( 2 ) ] = get_param( 3 );
  333.  
  334. @fwTakeDamage( iVictim, iInflictor, iAttacker, Float:fDamage, iDmgBits )
  335.     if ( IS_PLAYER( iAttacker ) && iAttacker != iVictim && get_user_weapon( iAttacker ) == CSW_KNIFE )
  336.     {
  337.         fDamage += Float:ArrayGetCell( g_daKnives[ 5 ], g_iPlayerInfos[ iAttacker ][ iPlayerSelected ] );
  338.        
  339.         SetHamParamFloat( 4, fDamage );
  340.        
  341.         new Float:fKB = Float:ArrayGetCell( g_daKnives[ 6 ], g_iPlayerInfos[ iAttacker ][ iPlayerSelected ] );
  342.        
  343.         if ( fKB )
  344.             fnCreateKnockback( iVictim, iAttacker, fKB + fDamage );
  345.     }
  346.  
  347. @fwWeaponKnifePost( iEnt )
  348. {
  349.     new iOwner = entity_get_edict( iEnt, EV_ENT_owner );
  350.    
  351.     if ( iOwner )
  352.     {
  353.         new sModels[ 32 ];
  354.         ArrayGetString( g_daKnives[ 1 ], g_iPlayerInfos[ iOwner ][ iPlayerSelected ], sModels, charsmax( sModels ) );
  355.         entity_set_string( iOwner, EV_SZ_viewmodel, sModels );
  356.         ArrayGetString( g_daKnives[ 2 ], g_iPlayerInfos[ iOwner ][ iPlayerSelected ], sModels, charsmax( sModels ) );
  357.         entity_set_string( iOwner, EV_SZ_weaponmodel, sModels );
  358.     }
  359. }
  360.  
  361. @fwPlayerSpawnPost( iPlayerId )
  362.     if ( is_user_alive( iPlayerId ) )
  363.         switch ( g_fMap )
  364.         {
  365.             case 1.0: set_task( 2.5, "@fnSpawnSettings", iPlayerId );
  366.             case 35.0: set_task( 2.0, "@fnSpawnSettings", iPlayerId );
  367.             default: @fnSpawnSettings( iPlayerId );
  368.         }
  369.  
  370. @fwResetMaxSpeedPost( iPlayerId )
  371.     if ( is_user_alive( iPlayerId ) && entity_get_float( iPlayerId, EV_FL_maxspeed ) > 1.0 )
  372.         entity_set_float( iPlayerId, EV_FL_maxspeed, Float:ArrayGetCell( g_daKnives[ 3 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  373.  
  374. //Bugfix
  375. @fnSpawnSettings( iPlayerId )
  376. {
  377.     entity_set_float( iPlayerId, EV_FL_health, g_fMap + Float:ArrayGetCell( g_daKnives[ 7 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  378.  
  379.     set_rendering( iPlayerId, kRenderFxGlowShell ,0, 0, 0, kRenderTransAlpha, ArrayGetCell( g_daKnives[ 8 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  380.  
  381.     entity_set_float( iPlayerId, EV_FL_gravity, Float:ArrayGetCell( g_daKnives[ 4 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  382. }
  383.  
  384. // Bugfix
  385. @evHealthPre( iMsgId, iMsgDest, iMsgEnt )
  386. {
  387.     new iHp = get_msg_arg_int( 1 );
  388.     if ( iHp > 256 )
  389.     {
  390.         if ( iHp % 256 == 0 )
  391.             iHp > 0 ? entity_set_float( iMsgEnt, EV_FL_health, entity_get_float( iMsgEnt, EV_FL_health ) + 1.0 ) : user_kill( iMsgEnt );
  392.  
  393.         set_msg_arg_int( 1, get_msg_argtype( 1 ), 255 );
  394.     }
  395. }
  396.  
  397. @evDeathPost( )
  398. {
  399.     new iKiller = read_data( 1 );
  400.  
  401.     if ( IS_PLAYER( iKiller ) && g_iPlayerConnected & ( 1 << ( iKiller & 31 ) ) )
  402.     {
  403.         new iVictim = read_data( 2 );
  404.         new iHs = read_data( 3 );
  405.         new iXp, iPoint;
  406.  
  407.         iXp = iHs ? g_iCvarHsXp : g_iCvarKillXp;
  408.         iPoint = iHs ? g_iCvarHsPts : g_iCvarKillPts;
  409.  
  410.         g_iPlayerInfos[ iKiller ][ iPlayerXp ] += iXp;
  411.         g_iPlayerInfos[ iKiller ][ iPlayerPoints ] += iPoint;
  412.  
  413.         switch ( g_iCvarKillMsgs )
  414.         {
  415.             case 1: client_print_color( iKiller, iKiller, "%L", LANG_SERVER, "KILLMSGKILLER", g_sPlayerName[ iVictim ], iXp, iPoint );
  416.             case 2:
  417.             {
  418.                 client_print_color( iKiller, iKiller, "%L", LANG_SERVER, "KILLMSGKILLER", g_sPlayerName[ iVictim ], iXp, iPoint );
  419.                 client_print_color( iVictim, iVictim, "%L", LANG_SERVER, "KILLMSGVICTIM", g_sPlayerName[ iKiller ] );
  420.             }
  421.         }
  422.     }
  423.     fnCheckLevel( iKiller );
  424. }
  425.  
  426. @fnShowMenu( iPlayerId )
  427.     fnMainMenu( iPlayerId, 0 );
  428.  
  429. fnMainMenu( iPlayerId, iMenu )
  430. {
  431.     new sMenu[ 78 ], sInfo[ 16 ], iMenuId;
  432.    
  433.     switch ( iMenu )
  434.     {
  435.         case 0:
  436.         {
  437.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU0", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] ), g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ]  );
  438.             iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  439.            
  440.             if ( ArraySize( g_daKnives[ 0 ] ) )
  441.             {
  442.                 formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "KNIFEMENU" );
  443.                 menu_additem( iMenuId, sMenu, "1 0" );
  444.             }
  445.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "GIFTINGMENU" );
  446.             menu_additem( iMenuId, sMenu, "2 0" );
  447.             if ( ArraySize( g_daItemCost ) )
  448.             {
  449.                 formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "SHOPMENU" );
  450.                 menu_additem( iMenuId, sMenu, "3 0" );
  451.             }
  452.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "PLAYERSMENU" );
  453.             menu_additem( iMenuId, sMenu, "4 0" );
  454.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "ADDINGMENU" );
  455.             menu_additem( iMenuId, sMenu, "5 0", g_iADD_FLAG );
  456.         }
  457.         case 1:
  458.         {
  459.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU1", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] ) );
  460.             iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  461.  
  462.             new iSize = ArraySize( g_daKnives[ 0 ] );
  463.             for ( new i; i < iSize; ++i )
  464.             {
  465.                 formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "KNIVES", ArrayGetStringHandle( g_daKnives[ 0 ], i ), ArrayGetCell( g_daKnives[ 9 ], i ) );
  466.                 formatex( sInfo, charsmax( sInfo ), "%i 1", i );
  467.                 menu_additem( iMenuId, sMenu, sInfo );
  468.             }
  469.         }
  470.         case 2:
  471.         {
  472.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU2", g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ]  );
  473.             iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  474.  
  475.             for ( new i; i < MaxClients; ++i )
  476.                 if ( g_iPlayerConnected & ( 1 << ( i & 31 ) ) && iPlayerId != i )
  477.                 {
  478.                     formatex( sInfo, charsmax( sInfo ), "%i 2", i );
  479.                     menu_additem( iMenuId, g_sPlayerName[ i ], sInfo );
  480.                 }
  481.         }
  482.         case 3:
  483.         {
  484.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU3", g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ]  );
  485.             iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  486.  
  487.             new iSize = ArraySize( g_daItemCost );
  488.             for ( new i; i < iSize; ++i )
  489.             {
  490.                 ArrayGetString( g_daItemName, i, sMenu, charsmax( sMenu ) );
  491.                 formatex( sInfo, charsmax( sInfo ), "%i 3", i );
  492.                 menu_additem( iMenuId, sMenu, sInfo, ArrayGetCell( g_daItemAccess, i ), ArrayGetCell( g_daItemCallback, i ) );
  493.             }
  494.         }
  495.         case 4:
  496.         {
  497.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU4", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] ), g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ]  );
  498.             iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  499.  
  500.             for ( new i; i < MaxClients; ++i )
  501.                 if ( g_iPlayerConnected & ( 1 << ( i & 31 ) ) && iPlayerId != i )
  502.                 {
  503.                     formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "PLAYERINMENU", g_sPlayerName[ i ], g_iPlayerInfos[ i ][ iPlayerLvl ], g_iPlayerInfos[ i ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ i ][ iPlayerLvl ] ), g_iPlayerInfos[ i ][ iPlayerPoints ] );
  504.                     formatex( sInfo, charsmax( sInfo ), "%i 4", i );
  505.                     menu_additem( iMenuId, sMenu, sInfo );
  506.                 }
  507.         }
  508.         case 5:
  509.         {
  510.             formatex( sMenu, charsmax( sMenu ), "%L", LANG_SERVER, "MENU5" );
  511.             iMenuId = menu_create( sMenu, "@fnMenuHandler" );
  512.  
  513.             for ( new i; i < MaxClients; ++i )
  514.                 if ( g_iPlayerConnected & ( 1 << ( i & 31 ) ) )
  515.                 {
  516.                     formatex( sInfo, charsmax( sInfo ), "%i 5", i );
  517.                     menu_additem( iMenuId, g_sPlayerName[ i ], sInfo );
  518.                 }
  519.         }
  520.     }
  521.     menu_display( iPlayerId, iMenuId, 0 );
  522. }
  523.  
  524. @fnMenuHandler( iPlayerId, iMenuId, iItem )
  525. {
  526.     if ( iItem != MENU_EXIT )
  527.     {
  528.         new sMenuName[ 78 ], sInfo[ 32 ], sDatas[ 2 ][ 16 ], iKey, iMenuNum;
  529.         menu_item_getinfo( iMenuId, iItem, iKey, sInfo, charsmax( sInfo ), sMenuName, charsmax( sMenuName ), iMenuNum );
  530.         parse( sInfo, sDatas[ 0 ], charsmax( sDatas[ ] ), sDatas[ 1 ], charsmax( sDatas[ ] ) );
  531.         iKey = str_to_num( sDatas[ 0 ] );
  532.         iMenuNum = str_to_num( sDatas[ 1 ] );
  533.  
  534.         switch ( iMenuNum )
  535.         {
  536.             case 0:
  537.             {
  538.                 fnMainMenu( iPlayerId, iKey );
  539.             }
  540.             case 1:
  541.             {
  542.                 if ( g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] >= ArrayGetCell( g_daKnives[ 9 ], iKey ) )
  543.                 {
  544.                     new iRet;
  545.                     g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] = iKey;
  546.                     ExecuteForward( g_iForwards[ 2 ], iRet, iPlayerId, g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] );
  547.  
  548.                     if ( get_user_weapon( iPlayerId ) == CSW_KNIFE )
  549.                     {
  550.                         ArrayGetString( g_daKnives[ 1 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ], sMenuName, charsmax( sMenuName ) );
  551.                         entity_set_string( iPlayerId, EV_SZ_viewmodel, sMenuName );
  552.  
  553.                         ArrayGetString( g_daKnives[ 2 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ], sMenuName, charsmax( sMenuName ) );
  554.                         entity_set_string( iPlayerId, EV_SZ_weaponmodel, sMenuName );
  555.                     }
  556.  
  557.                     set_rendering( iPlayerId, kRenderFxGlowShell ,0, 0, 0, kRenderTransAlpha, ArrayGetCell( g_daKnives[ 8 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  558.  
  559.                     entity_set_float( iPlayerId, EV_FL_gravity, Float:ArrayGetCell( g_daKnives[ 4 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  560.  
  561.                     if ( entity_get_float( iPlayerId, EV_FL_maxspeed ) > 1.0 )
  562.                         entity_set_float( iPlayerId, EV_FL_maxspeed, Float:ArrayGetCell( g_daKnives[ 3 ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] ) );
  563.                 }
  564.                 else
  565.                     client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "NOTENOUGHLVL", g_sPREFIX );
  566.             }
  567.             case 2:
  568.             {
  569.                 if ( g_iPlayerConnected & ( 1 << ( iKey & 31 ) ) )
  570.                 {
  571.                     g_iTarget[ iPlayerId ] = iKey;
  572.                     client_cmd( iPlayerId, "messagemode GIFT" );
  573.                 }
  574.                 else
  575.                 {
  576.                     client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "TARGETDISCONNECTED", g_sPREFIX );
  577.                     fnMainMenu( iPlayerId, 2 );
  578.                 }
  579.             }
  580.             case 3:
  581.             {
  582.                 if ( g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] >= ArrayGetCell( g_daItemCost, iKey ) )
  583.                 {
  584.                     g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] -= ArrayGetCell( g_daItemCost, iKey );
  585.  
  586.                     callfunc_begin_i( ArrayGetCell( g_daItemFuncId, iKey ), ArrayGetCell( g_daItemPluginId, iKey ) );
  587.                     callfunc_push_int( iPlayerId );
  588.                     callfunc_push_int( iKey );
  589.                     callfunc_end( );
  590.  
  591.                     client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "SUCCPURCHASE", g_sPREFIX, ArrayGetStringHandle( g_daItemName, iKey ) );
  592.                 }
  593.                 else
  594.                     client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "UNSUCCPURCHASE", g_sPREFIX );
  595.             }
  596.             case 4:
  597.             {
  598.                 if ( g_iPlayerConnected & ( 1 << ( iKey & 31 ) ) )
  599.                     client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "PLAYERINMENU", g_sPlayerName[ iKey ], g_iPlayerInfos[ iKey ][ iPlayerLvl ], g_iPlayerInfos[ iKey ][ iPlayerXp ], ArrayGetCell( g_daLevels, g_iPlayerInfos[ iKey ][ iPlayerLvl ] ) );
  600.                 else
  601.                 {
  602.                     client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "TARGETDISCONNECTED", g_sPREFIX );
  603.                     fnMainMenu( iPlayerId, 4 );
  604.                 }
  605.             }
  606.             case 5:
  607.             {
  608.                 if ( g_iPlayerConnected & ( 1 << ( iKey & 31 ) ) )
  609.                 {
  610.                     g_iTarget[ iPlayerId ] = iKey;
  611.                     client_cmd( iPlayerId, "messagemode ADD" );
  612.                 }
  613.                 else
  614.                 {
  615.                     client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "TARGETDISCONNECTED", g_sPREFIX );
  616.                     fnMainMenu( iPlayerId, 5 );
  617.                 }
  618.             }
  619.         }
  620.     }
  621.     menu_destroy( iMenuId );
  622.     return PLUGIN_HANDLED;
  623. }
  624.  
  625. @fnGiftHandler( iPlayerId )
  626. {
  627.     new sData[ 191 ], iNum;
  628.     read_args( sData, charsmax( sData ) );
  629.     remove_quotes( sData );
  630.    
  631.     if ( is_str_num( sData ) )
  632.     {
  633.         iNum = str_to_num( sData );
  634.        
  635.         if ( g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] >= iNum )
  636.         {
  637.             g_iPlayerInfos[ g_iTarget[ iPlayerId ] ][ iPlayerPoints ] += iNum;
  638.             g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] -= iNum;
  639.             client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "SUCCGIFTING", g_sPREFIX, g_sPlayerName[ g_iTarget [ iPlayerId ] ], iNum );
  640.             client_print_color( g_iTarget[ iPlayerId ], g_iTarget[ iPlayerId ], "%L", LANG_SERVER, "GETPOINTS", g_sPREFIX, iNum, g_sPlayerName[ iPlayerId ] );
  641.         }
  642.         else
  643.             client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "NOTENOUGHPOINT", g_sPREFIX );
  644.     }
  645.     else
  646.     {
  647.         client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "INVALIDVALUE", g_sPREFIX );
  648.         client_cmd( iPlayerId, "messagemode GIFT" );
  649.     }
  650. }
  651.  
  652. @fnAddHandler( iPlayerId )
  653. {
  654.     new sData[ 191 ], iNum;
  655.     read_args( sData, charsmax( sData ) );
  656.     remove_quotes( sData );
  657.    
  658.     if ( is_str_num( sData ) )
  659.     {
  660.         iNum = str_to_num( sData );
  661.        
  662.         g_iPlayerInfos[ g_iTarget[ iPlayerId ] ][ iPlayerPoints ] += iNum;
  663.         client_print_color( 0, print_team_default, "%L", LANG_SERVER, "ADDTEXT", g_sPREFIX, g_sPlayerName[ iPlayerId ], g_sPlayerName[ g_iTarget[ iPlayerId ] ], iNum );
  664.     }
  665.     else
  666.     {
  667.         client_print_color( iPlayerId, iPlayerId, "%L", LANG_SERVER, "INVALIDVALUE", g_sPREFIX );
  668.         client_cmd( iPlayerId, "messagemode ADD" );
  669.     }
  670. }
  671.  
  672. @fnAddXp( iPlayerId, iAdminLevel, iCommandId )
  673.     if ( cmd_access( iPlayerId, iAdminLevel, iCommandId, 2 ) )
  674.     {
  675.         new sArg[ 32 ], sXp[ 11 ];
  676.         read_argv( 1, sArg, charsmax( sArg ) );
  677.         read_argv( 2, sXp, charsmax( sXp ) );
  678.        
  679.         new iTarget = cmd_target( iPlayerId, sArg, CMDTARGET_ALLOW_SELF | CMDTARGET_NO_BOTS );
  680.  
  681.         g_iPlayerInfos[ iTarget ][ iPlayerXp ] += str_to_num( sXp );
  682.        
  683.         fnCheckLevel( iTarget );
  684.     }
  685.  
  686. public client_infochanged( iPlayerId )
  687. {
  688.     new sNewName[ 32 ];
  689.     get_user_info( iPlayerId, "name", sNewName, charsmax( sNewName ) );
  690.    
  691.     if ( !equal( g_sPlayerName[ iPlayerId ], sNewName ) )
  692.     {
  693.         g_sPlayerName[ iPlayerId ][ 0 ] = EOS;
  694.         copy( g_sPlayerName[ iPlayerId ], charsmax( g_sPlayerName[ ] ), sNewName );
  695.     }
  696. }
  697.  
  698. public client_authorized( iPlayerId, const sSteamId[ ] )
  699.     if ( sSteamId[ 0 ] != 'B' ) // If client is a bot, then sSteamId equal with "BOT"
  700.     {
  701.         g_iPlayerConnected |= ( 1 << ( iPlayerId & 31 ) )
  702.         get_user_name( iPlayerId, g_sPlayerName[ iPlayerId ], charsmax( g_sPlayerName[ ] ) );
  703.         fnLoadPlayerDatas( iPlayerId, sSteamId );
  704.     }
  705.  
  706. public client_disconnect( iPlayerId )
  707.     if ( !is_user_bot( iPlayerId ) )
  708.     {
  709.         new sSteamId[ 32 ];
  710.         get_user_authid( iPlayerId, sSteamId, charsmax( sSteamId ) );
  711.         g_iPlayerConnected &= ~( 1 << ( iPlayerId & 31 ) )
  712.         #if defined SQL
  713.         fnSavePlayerDatas( iPlayerId, sSteamId, 0 );
  714.         #else
  715.         fnSavePlayerDatas( iPlayerId, sSteamId );
  716.         #endif
  717.     }
  718.  
  719. #if defined SQL
  720.  
  721. fnLoadPlayerDatas( iPlayerId, const sSteamId[ ] )
  722. {
  723.     static sText[ 128 ], iArray[ 1 ];
  724.     iArray[ 0 ] = iPlayerId;
  725.  
  726.     formatex( sText, charsmax( sText ), "SELECT * FROM `KnifeSystem` WHERE SteamId = ^"%s^"", sSteamId );
  727.     SQL_ThreadQuery( g_iSqlTuple, "@fnThreadHandler", sText, iArray, sizeof ( iArray ) );
  728. }
  729.  
  730. fnSavePlayerDatas( iPlayerId, const sSteamId[ ], iMode )
  731. {
  732.     static sText[ 512 ];
  733.  
  734.     if ( iMode )
  735.         formatex( sText, charsmax( sText ), "INSERT INTO `KnifeSystem` ( `SteamId`,`Level`,`Xp`,`Points`,`Selected` ) VALUES ( ^"%s^", ^"0^", ^"0^", ^"0^", ^"0^" )", sSteamId );
  736.     else
  737.         formatex( sText, charsmax( sText ), "UPDATE `KnifeSystem` SET Level = ^"%i^" Xp = ^"%i^" Points = ^"%i^" Selected = ^"%i^" WHERE SteamId = ^"%s^"", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ], sSteamId );
  738.    
  739.     SQL_ThreadQuery( g_iSqlTuple, "@fnThreadHandler", sText );
  740. }
  741.  
  742. @fnThreadHandler( iFailState, Handle:iQuery, const sErrorMsg[ ], iErrorCode, const iARRAY[ ], iArraySize, Float:fQueueTime )
  743. {
  744.     new sText[ 128 ];
  745.     if ( iFailState == TQUERY_CONNECT_FAILED )
  746.     {
  747.         formatex( sText, charsmax( sText ), "%L", LANG_SERVER, "TQUERY_CONNECT_FAILED" );
  748.         set_fail_state( sText );
  749.         return;
  750.     }
  751.     else if ( iFailState == TQUERY_QUERY_FAILED )
  752.     {
  753.         formatex( sText, charsmax( sText ), "%L", LANG_SERVER, "TQUERY_QUERY_FAILED" );
  754.         set_fail_state( sText );
  755.         return;
  756.     }
  757.  
  758.     if ( iErrorCode )
  759.     {
  760.         log_amx( "%i - %s", iErrorCode, sErrorMsg );
  761.         return;
  762.     }
  763.  
  764.     if ( iArraySize )
  765.     {
  766.         new iPlayerId = iARRAY[ 0 ];
  767.    
  768.         if ( iPlayerId )
  769.             if ( SQL_NumResults( iQuery ) > 0 )
  770.             {
  771.                 g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] = SQL_ReadResult( iQuery, SQL_FieldNameToNum( iQuery, "Selected" ) );
  772.                 g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] = SQL_ReadResult( iQuery, SQL_FieldNameToNum( iQuery, "Points" ) );
  773.                 g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] = SQL_ReadResult( iQuery, SQL_FieldNameToNum( iQuery, "Level" ) );
  774.                 g_iPlayerInfos[ iPlayerId ][ iPlayerXp ] = SQL_ReadResult( iQuery, SQL_FieldNameToNum( iQuery, "Xp" ) );
  775.             }
  776.             else
  777.             {
  778.                 new sSteamId[ 32 ];
  779.                 arrayset( g_iPlayerInfos[ iPlayerId ], 0, sizeof ( g_iPlayerInfos[ ] ) );
  780.                 get_user_authid( iPlayerId, sSteamId, charsmax( sSteamId ) );
  781.                 fnSavePlayerDatas( iPlayerId, sSteamId, 1 );
  782.             }
  783.     }
  784.  
  785.     return;
  786. }
  787.  
  788. #else
  789.  
  790. fnLoadPlayerDatas( iPlayerId, const sSteamId[ ] )
  791. {
  792.     new sData[ 51 ];
  793.  
  794.     if ( nvault_get( g_iNvaultId, sSteamId, sData, charsmax( sData ) ) )
  795.     {
  796.         new sLevel[ 11 ], sXp[ 11 ], sPoints[ 11 ], sSelected[ 11 ];
  797.         parse( sData, sLevel, charsmax( sLevel ), sXp, charsmax( sXp ), sPoints, charsmax( sPoints ), sSelected, charsmax( sSelected ) );
  798.         g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] = str_to_num( sLevel );
  799.         g_iPlayerInfos[ iPlayerId ][ iPlayerXp ] = str_to_num( sXp );
  800.         g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ] = str_to_num( sPoints );
  801.         g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] = str_to_num( sSelected );
  802.     }
  803.     else
  804.         arrayset( g_iPlayerInfos[ iPlayerId ], 0, sizeof ( g_iPlayerInfos[ ] ) );
  805. }
  806.  
  807. fnSavePlayerDatas( iPlayerId, const sSteamId[ ] )
  808. {
  809.     new sData[ 51 ];
  810.  
  811.     formatex( sData, charsmax( sData ), " %i %i %i %i ", g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ], g_iPlayerInfos[ iPlayerId ][ iPlayerXp ], g_iPlayerInfos[ iPlayerId ][ iPlayerPoints ], g_iPlayerInfos[ iPlayerId ][ iPlayerSelected ] );
  812.     nvault_set( g_iNvaultId, sSteamId, sData );
  813. }
  814.  
  815. #endif
  816.  
  817. fnArrayPushModel( sMdl[ ], iMdl, iArrayId )
  818. {
  819.     if ( !equal( sMdl, "models/", 7 ) )
  820.         format( sMdl, iMdl, "models/%s", sMdl );
  821.    
  822.     if ( !equal( sMdl[ strlen( sMdl ) - 4 ], ".mdl", 4 ) )
  823.         add( sMdl, iMdl, ".mdl" );
  824.  
  825.     precache_model( sMdl );
  826.     ArrayPushString( g_daKnives[ iArrayId ], sMdl );
  827. }
  828.  
  829. fnCheckLevel( iPlayerId )
  830. {
  831.     new iMax = ArraySize( g_daLevels ) - 1;
  832.     if ( g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] < iMax )
  833.     {
  834.         new iRet;
  835.         while ( g_iPlayerInfos[ iPlayerId ][ iPlayerXp ] >= ArrayGetCell( g_daLevels, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] ) )
  836.         {
  837.             ++g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ];
  838.             ExecuteForward( g_iForwards[ 0 ], iRet, iPlayerId, g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] );
  839.            
  840.             if ( g_iPlayerInfos[ iPlayerId ][ iPlayerLvl ] == iMax )
  841.             {
  842.                 ExecuteForward( g_iForwards[ 1 ], iRet, iPlayerId );
  843.                 break;
  844.             }
  845.         }
  846.     }
  847. }
  848.  
  849. // Credits to ConnorMcLeod ( conorr )
  850. fnCreateKnockback( iVictim, iAttacker, Float:fKB )
  851. {
  852.     new Float:fVictimO[ 3 ], Float:fAttackerO[ 3 ], Float:fVictimV[ 3 ], Float:fValue;
  853.     entity_get_vector( iVictim, EV_VEC_origin, fVictimO );
  854.     entity_get_vector( iAttacker, EV_VEC_origin, fAttackerO );
  855.  
  856.     fVictimO[ 0 ] -= fAttackerO[ 0 ];
  857.     fVictimO[ 1 ] -= fAttackerO[ 1 ];
  858.     fVictimO[ 2 ] -= fAttackerO[ 2 ];
  859.  
  860.     fValue = 1.0 / floatsqroot( fVictimO[0] * fVictimO[0] + fVictimO[1] * fVictimO[1] + fVictimO[2] * fVictimO[2] );
  861.     fVictimO[ 0 ] *= fValue;
  862.     fVictimO[ 1 ] *= fValue;
  863.     fVictimO[ 2 ] *= fValue;
  864.  
  865.     entity_get_vector( iVictim, EV_VEC_velocity, fVictimV );
  866.  
  867.     fVictimO[ 0 ] *= fKB
  868.     fVictimO[ 1 ] *= fKB
  869.     fVictimO[ 2 ] *= fKB
  870.  
  871.     fVictimV[ 0 ] += fVictimO[ 0 ];
  872.     fVictimV[ 1 ] += fVictimO[ 1 ];
  873.     fVictimV[ 2 ] += fVictimO[ 2 ];
  874.  
  875.     entity_set_vector( iVictim, EV_VEC_velocity, fVictimV );
  876. }
  877. //
  878.  
  879. public plugin_end( )
  880. {
  881.     for ( new i; i < sizeof ( g_daKnives ); ++i )
  882.         ArrayDestroy( g_daKnives[ i ] );
  883.  
  884.     ArrayDestroy( g_daItemCost );
  885.     ArrayDestroy( g_daItemAccess );
  886.     ArrayDestroy( g_daItemCallback );
  887.     ArrayDestroy( g_daItemFuncId );
  888.     ArrayDestroy( g_daItemName );
  889.     ArrayDestroy( g_daItemPluginId );
  890.    
  891.     ArrayDestroy( g_daLevels );
  892.  
  893. #if defined SQL
  894.     SQL_FreeHandle( g_iSqlTuple );
  895. #else
  896.     nvault_close( g_iNvaultId );
  897. #endif
  898. }


inc
  1. /* Header generated by AMXX-Studio*/
  2.  
  3. #if defined _KnifeSystem_included
  4.     #endinput
  5. #endif
  6. #define _KnifeSystem_included
  7.  
  8. enum _:eKnifeDatas
  9. {
  10.     sName,
  11.     sVModel,
  12.     sPModel,
  13.     fSpeed,
  14.     fGravity,
  15.     fDamage,
  16.     fKnockback, // Változás! int -> float
  17.     fHealth,    // Változás! int -> float
  18.     iVisibly,
  19.     iLevel
  20. }
  21.  
  22. enum _:ePlayerInfo
  23. {
  24.     iPlayerLvl,
  25.     iPlayerXp,
  26.     iPlayerPoints,
  27.     iPlayerSelected
  28. };
  29.  
  30. native ks_get_max_level( );
  31.  
  32. native ks_set_player_info( iPlayerId, iPlayerInfo, iValue );
  33.  
  34. native ks_get_player_info( iPlayerId, iPlayerInfo );
  35.  
  36. native ks_get_knife_info( iKnifeInfo, iKnifeId, any:... );
  37.  
  38. native ks_register_item( const sItemName[ ], const sItemFunction[ ], iCost, iAccess = 0 );
  39.  
  40. native ks_register_item_callback( iItemId, iCallbackId );
  41.  
  42. forward ks_level_up( iPlayerId, iPlayerNewLvl );
  43.  
  44. forward ks_max_lvl_reached( iPlayerId );
  45.  
  46. forward ks_knife_selected( iPlayerId, iKnifeId );


txt
Kód:
[en]
KEY1 = VMODEL
KEY2 = PMODEL
KEY3 = SPEED
KEY4 = GRAVITY
KEY5 = DAMAGE
KEY6 = KNOCKBACK
KEY7 = HEALTH
KEY8 = VISIBLY
KEY9 = LEVEL
MENU0 = Mainmenu^nLevel: %i Xp: %i/%i Points: %i
MENU1 = Knifemenu^nLevel: %i Xp: %i/%i
MENU2 = Giftingmenu^nPoints: %i
MENU3 = Shop^nPoints: %i
MENU4 = Players^nLevel %i Xp: %i / %i Points: %i
MENU5 = Adding
KNIFEMENU = Knives
GIFTINGMENU = Gifting
SHOPMENU = Shop
PLAYERSMENU = Players
ADDINGMENU = Adding
KNIVES = %a [Level:%i]
NOTENOUGHLVL = ^4%s^1Sorry, you don't have enough level for this^4!
TARGETDISCONNECTED = ^4%s^1Sorry, your target have already disconnected^4!
SUCCPURCHASE = ^4%s ^1You bought succesfull: ^3%a^4!
UNSUCCPURCHASE = ^4%s ^1Unsuccessfull purchase, you don't have enough point^4!
PLAYERINMENU = %s [Lvl:%i][Xp:%i/%i][P:%i]
INVALIDVALUE = ^4%s^1You gave an invalid value, please try again^4!
ADDTEXT = ^4%s^3%s ^1added to ^3%s ^3%i ^1point ^4!
NOTENOUGHPOINT = ^4%s ^1You don't have enough point^4!
SUCCGIFTING = ^4%s^1You gave successfull ^3%i ^1point to ^3%s^4!
GETPOINTS = ^4%s ^1You got ^3%i ^1point from ^3%s^4!
KILLMSGKILLER = ^4%s ^1For %s's killing you received ^3%i ^1xp and ^3%i ^1point^4!
KILLMSGVICTIM = ^4%s ^3%s ^1killed you^4!
INVALIDNVAULTID = Invalid nvault id!
TQUERY_CONNECT_FAILED = Connection fail!
TQUERY_QUERY_FAILED = Query fail!
MISSINGFILE = Missing file! ( %s )

[hu]
KEY1 = VMODEL
KEY2 = PMODEL
KEY3 = SEBESSEG
KEY4 = GRAVITACIO
KEY5 = SEBZES
KEY6 = VISSZALOKES
KEY7 = ELET
KEY8 = LATHATOSAG
KEY9 = SZINT
MENU0 = Főmenü^nSzint: %i Tp: %i/%i Pontok: %i
MENU1 = Késmenü^nSzint: %i Tp: %i/%i
MENU2 = Ajándékozásmenü^nPontok: %i
MENU3 = Bolt^nPontok: %i
MENU4 = Játékosok^nSzint: %i Tp: %i / %i Pontok: %i
MENU5 = Addolás
KNIFEMENU = Kések
GIFTINGMENU = Ajándékozás
SHOPMENU = Bolt
PLAYERSMENU = Játékosok
ADDINGMENU = Addolás
KNIVES = %a [Szint:%i]
NOTENOUGHLVL = ^4%s ^1Sajnáljuk, nincs elég szinted ehhez^4!
TARGETDISCONNECTED = ^4%s ^1Sajnáljuk, a célpontod már lecsatlakozott^4!
SUCCPURCHASE = ^4%s^1Sikeresen megvásároltad: ^3%a^4!
UNSUCCPURCHASE = ^4%s^1Sikertelen vásárlás, nincs elég pontod^4!
PLAYERINMENU = %s [Szint:%i][Tp:%i/%i][P:%i]
INVALIDVALUE = ^4%s ^1Érvénytelen értéket adtál meg, próbáld újra^4!
ADDTEXT = ^4%s ^3%s ^1addolt ^3%s ^1-nak ^3%i pontot^4!
NOTENOUGHPOINT = ^4%s ^1Nincs elég pontod^4!
SUCCGIFTING = ^4%s^1Sikeresen adtál ^3 %i pontot ^3 %s ^1-nak^4!
GETPOINTS = ^4%s^1Kaptál ^3%i ^1pontot ^3%s -től^4!
KILLMSGKILLER = ^4%s ^3%s megöléséért kaptál ^3%i tp-t és ^3%i pontot^4!
KILLMSGVICTIM = ^4%s ^3%s megölt téged^4!
INVALIDNVAULTID = Érvénytelen nvault azonosító!
TQUERY_CONNECT_FAILED = Csatlakozási hiba!
TQUERY_QUERY_FAILED = Lekérés hiba!
MISSINGFILE = Hiányzó fájl! ( %s )

_________________
Néha itt, de többször nem.

Ők köszönték meg Akosch:. nek ezt a hozzászólást: mforce (2016.02.01. 22:36)
  Népszerűség: 2.27%


Hozzászólás jelentése
Vissza a tetejére
   
 Hozzászólás témája: Re: Kés Rendszer v2
HozzászólásElküldve: 2016.02.06. 16:39 
Offline
Senior Tag
Avatar

Csatlakozott: 2015.06.11. 01:54
Hozzászólások: 220
Megköszönt másnak: 46 alkalommal
Megköszönték neki: 13 alkalommal
Nem működik, nem lehet lefordítani.

_________________
Kép


Hozzászólás jelentése
Vissza a tetejére
   
Hozzászólások megjelenítése:  Rendezés  
Új téma nyitása  Hozzászólás a témához  [ 21 hozzászólás ]  Oldal 1 2 3 Következő


Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 8 vendég


Nem nyithatsz témákat ebben a fórumban.
Válaszolhatsz egy témára ebben a fórumban.
Nem szerkesztheted a hozzászólásaidat ebben a fórumban.
Nem törölheted a hozzászólásaidat ebben a fórumban.
Nem küldhetsz csatolmányokat ebben a fórumban.

Keresés:
Ugrás:  
Powered by phpBB® Forum Software © phpBB Limited
Magyar fordítás © Magyar phpBB Közösség
Portal: Kiss Portal Extension © Michael O'Toole