Szerző Téma: Ha a játékos fegyvert kap  (Megtekintve 1549 alkalommal)

Ha a játékos fegyvert kap
« Dátum: 2016. október 23. - 10:03:55 »
0 Show voters
Sziasztok egy olyan kérdésem lenne hogy azt hogyan tudom lekérdezni pl OnPlayerUpdate-nél hogy a játékos kapott e úgy fegyvert ? Tehát úgy szeretném hogy folyamatossan az OnPlayerUpdate csekkolja a játékos fegyvereit és ha kap egy fegyvert akkor írja ki hogy kapott egy fegyvert. Előre is köszönöm!

Ha a játékos fegyvert kap
« Válasz #1 Dátum: 2016. október 23. - 11:01:10 »
0 Show voters

new PlayerWeapon[MAX_PLAYERS];
public OnPlayerUpdate(playerid)
{
new weap = GetPlayerWeapon(playerid);
if(PlayerWeapon[playerid] != weap)
{
new str[144 + 1];
PlayerWeapon[playerid] = weap;
format(str, sizeof(str), \"Kaptál egy %s típusú fegyvert.\", WeaponNames[weap]);
SendClientMessage(playerid, -1, str);
}
}

 

new WeaponNames[][32] = {
{\"Ököl\"}, // 0
{\"Boxer\"}, // 1
{\"Golf\"}, // 2
{\"Stick\"}, // 3
{\"Kés\"}, // 4
{\"Baseball\"}, // 5
{\"Shovel\"}, // 6
{\"Pool\"}, // 7
{\"Katana\"}, // 8
{\"Láncfűrész\"}, // 9
{\"PurpleDildo\"}, // 10
{\"BigWhiteVibrator\"}, // 11
{\"MediumWhiteVibrator\"}, // 12
{\"SmallWhiteVibrator\"}, // 13
{\"Virág\"}, // 14
{\"Cane\"}, // 15
{\"Gránát\"}, // 16
{\"Teargas\"}, // 17
{\"Molotov\"}, // 18
{\" \"}, // 19
{\" \"}, // 20
{\" \"}, // 21
{\"Colt45\"}, // 22
{\"SilencedColt45\"}, // 23
{\"Deagle\"}, // 24
{\"Shotgun\"}, // 25
{\"Sawnoff\"}, // 26
{\"Combat\"}, // 27
{\"Uzi\"}, // 28
{\"MP5\"}, // 29
{\"AK47\"}, // 30
{\"M4\"}, // 31
{\"Tec9\"}, // 32
{\"Rifle\"}, // 33
{\"Sniper\"}, // 34
{\"Rocket\"}, // 35
{\"HRocket\"}, // 36
{\"Flamethrower\"}, // 37
{\"Minigun\"}, // 38
{\"Satchel\"}, // 39
{\"Detonator\"}, // 40
{\"Spray\"}, // 41
{\"Fire\"}, // 42
{\"Camera\"}, // 43
{\"NightVision\"}, // 44
{\"InfraredVision\"}, // 45
{\"Parachute\"}, // 46
{\"FakePistol\"} // 47
};

 
Edit: Nem ajánlom, hogy OnPlayerUpdate alá rakd. Indíts neki egy timert, fél vagy egy másodperceset, még az is jobb.

Ha a játékos fegyvert kap
« Válasz #2 Dátum: 2016. október 23. - 11:21:21 »
0 Show voters
Jó de ez csak azt nézi ami a kezébe van. Hogy lehetne azt hogy ami nála van ?

Nem elérhető Flash

  • 5726
  • (っ◕‿◕)っ
    • Profil megtekintése
Ha a játékos fegyvert kap
« Válasz #3 Dátum: 2016. október 23. - 11:40:15 »
0 Show voters
GetPlayerWeaponData. Ciklussal vegigfuttatod.

Ha a játékos fegyvert kap
« Válasz #4 Dátum: 2016. október 23. - 11:57:14 »
0 Show voters
Megcsináltam így de így meg az a baj hogy folyamatossan ellenőrzi és mindig kiírja hogy kapott egy fegyvert, hogyan lehet azt hogy csak akkor írja ha egy újat kap ? Mer most a már nála lévőt is bejelzi.
 
public OnPlayerUpdate(playerid)
{
new wid, wammo;
for(new w = 0; w < 13; w++)
{
            GetPlayerWeaponData(playerid, w, wid, wammo);
            if(wid != 0 && wammo != 0)
            {
               Msg(playerid, \"Kaptál egy fegyvert.\");
            }
}
                return 1;
}

Ha a játékos fegyvert kap
« Válasz #5 Dátum: 2016. október 23. - 13:05:39 »
0 Show voters
külön csinálsz rá egy stockot vagy publikot amiben szerep a fegyverhozzáadás + hogy ki ír ja milyet kapott, az hogy az OnPlayerUpdate alá van rakva annak sok értelme nincs
 
new WeaponNames[][32] = {
{\"Ököl\"}, // 0
{\"Boxer\"}, // 1
{\"Golf\"}, // 2
{\"Stick\"}, // 3
{\"Kés\"}, // 4
{\"Baseball\"}, // 5
{\"Shovel\"}, // 6
{\"Pool\"}, // 7
{\"Katana\"}, // 8
{\"Láncfűrész\"}, // 9
{\"PurpleDildo\"}, // 10
{\"BigWhiteVibrator\"}, // 11
{\"MediumWhiteVibrator\"}, // 12
{\"SmallWhiteVibrator\"}, // 13
{\"Virág\"}, // 14
{\"Cane\"}, // 15
{\"Gránát\"}, // 16
{\"Teargas\"}, // 17
{\"Molotov\"}, // 18
{\" \"}, // 19
{\" \"}, // 20
{\" \"}, // 21
{\"Colt45\"}, // 22
{\"SilencedColt45\"}, // 23
{\"Deagle\"}, // 24
{\"Shotgun\"}, // 25
{\"Sawnoff\"}, // 26
{\"Combat\"}, // 27
{\"Uzi\"}, // 28
{\"MP5\"}, // 29
{\"AK47\"}, // 30
{\"M4\"}, // 31
{\"Tec9\"}, // 32
{\"Rifle\"}, // 33
{\"Sniper\"}, // 34
{\"Rocket\"}, // 35
{\"HRocket\"}, // 36
{\"Flamethrower\"}, // 37
{\"Minigun\"}, // 38
{\"Satchel\"}, // 39
{\"Detonator\"}, // 40
{\"Spray\"}, // 41
{\"Fire\"}, // 42
{\"Camera\"}, // 43
{\"NightVision\"}, // 44
{\"InfraredVision\"}, // 45
{\"Parachute\"}, // 46
{\"FakePistol\"} // 47
};
stock FegyverAdas(playerid,weaponid,ammo)
{
GivePlayerWeapon(playerid,weaponid,ammo);
new uzenet[64];
format(uzenet,sizeof(uzenet),\"Kaptál egy %s -et %d lőszerrel\",WeaponNames[weaponid],ammo);
SendClientMessage(playerid,-1,uzenet);
return 1;
}

 
esetleg így?
és akkor úgy adsz fegyvert hogy pl
FegyverAdas(playerid,31,100);

Nem elérhető whadez

  • 719
  • DEFEATER
    • Profil megtekintése
Ha a játékos fegyvert kap
« Válasz #6 Dátum: 2016. november 09. - 23:15:50 »
0 Show voters
Nem teszteltem, nem mondom biztosra, de nézd meg azért.
 

stock GivePlayerWeaponEx(playerid, weaponid, ammo) {
new tempVar[2];
GetPlayerWeaponData(playerid, GetWeaponSlot(weaponid), tempVar[0], tempVar[1]);
if(tempVar[0]==0&&tempVar[1]==0) {
SendClientMessage(playerid, -1, #Kaptál egy fegyvert!);
}
}
#if defined _ALS_GivePlayerWeapon
#undef GivePlayerWeapon
#else
#define _ALS_GivePlayerWeapon
#endif
#define GivePlayerWeapon GivePlayerWeaponEx

 
Így próbáld meg ha az előző megoldások nem szuperálnak, nem tudom hogy a mód hogyan néz ki, előfordulhat hogy bővíteni kell majd egy kicsit.  :wave:

Ha a játékos fegyvert kap
« Válasz #7 Dátum: 2016. november 10. - 23:54:35 »
0 Show voters
Hello
Jó a kérdés :D Hát nem jut eszembe valóban értelmes megoldás :D De! azért annyit hozzátennék, h az OnPlayerUpdate-val óvatosan bánj, ahogy néztem kb. 30x fut le másodpercenként.. https://wiki.sa-mp.com/wiki/OnPlayerUpdate
A lenti megoldásom NEM tökéletes (és nem teszteltem remélem működik :D). Meg kell adni neki egy intervallumot, de még így se jó annyira..NE adj meg túl kicsi intervallumot!
A lényege az lenne, h külön fs-ként betöltöd (vagy berakod valamelyik meglevőbe, ez már m1) és minden scriptben meghívja az OnPlayerReceiveWeapon-t, ahol az létezik.
Elvileg érzékelnie kellene ha bármelyik sloton megváltozik vmelyik fegyver.
Észrevételek és elméleti baszakvás:
A GivePlayerWeapon-os újradefiniálgatós megoldással sztem két alapvető gond van:
- csak abban a scriptben működik, ahol implementálva van a változtatás
- ha minden igaz a játékos nem csak az által kaphat fegyvert (l. SetSpawnInfo épp vmelyik nap jött fel vmelyik témában)
A legjobb megoldás sztem az lenne ha írnánk rá egy plugint. Erre hirtelen az az ötletem lenne h azokat a fv-eket, amik érintik a fegyverek adását kis manipulálással átirányítanánk módosított fv-ekre, amik kezelik ezt a problémát. Sokkal hatékonyabb és elegánsabb lenne, mint így megoldani.
(Vagy a SetSpawnInfo-t is meg minden ilyen fv-t át kell írni minden kódban és pl fájlba, PVar-ba tárolgatni a dolgokat... de ez csak elmélkedés xd) így ugye közel univerzális megoldást kaphatnánk. :)
Jim Toretto megoldásával ha jól látom az a gond, h lekéri a fegyvereket egy lokális változóba de nem tárolja magasabb szinten őket, ezért ahol van fegyver (gondolom a nem 0 érték) azt mindig új fegyver kapásának fogja venni. :)
Illetve DEFEATER megoldásával ránézésre ezek a gondok vannak sztem:
- GivePlayerWeapon újradefiniálás akar lenni de tkp a GivePlayerWeapon nincs is benne alkalmazva pl a végén, tehát fegyvert nem is lenne képes adni
- hiányzik a GetWeaponSlot implementációja, gondolom az megmondaná az id-hez tartozó slotot a fegyverek táblázatából :) (ami itt érhető el: https://wiki.sa-mp.com/wiki/Weapons)
- a fegyvert 0-hoz hasonlítja, nem a megadott weaponid-hez
- a töltények mennyisége sztem irreleváns, de lehet tévedek
- fv-en belül küld üzenetet eljárás hívás helyett, ami nem egy szép és hatékony megvalósítás
félreértés végett nem sértésből hanem segítő szándékkal ez csak néhány észrevétel. :)
Nah de remélem ezzel mész valamire:
 
#include <a_samp>
// Vedd figyelembe, hogy az OnPlayerUpdate mp-ént kb. 30x fut le, szval nem kellene túlterhelni.. így se a legjobb..
#define WEAPON_CHECK_INTERVAL 2500 // milliszekundumban van megadva (1s = 1000ms), ez 2.5 mp..
new WeaponsChecked[MAX_PLAYERS], WeaponData[MAX_PLAYERS][13];
forward OnPlayerReceiveWeapon(playerid, slot, weaponid, ammo);
// Ezt bármelyik szkriptedbe beteheted csak előtte forward-old, ahogy fenn is látod
public OnPlayerReceiveWeapon(playerid, slot, weaponid, ammo) {
new formatstring[128];
format(formatstring, 128, \"NEW WEAPON! SLOT: %d | ID: %d | AMMO: %d\", slot, weaponid, ammo);
SendClientMessage(playerid, 0x00aa00ff, formatstring);
return 1;
}
public OnPlayerDisconnect(playerid, reason) {
WeaponData[playerid] = {0,0,0,0,0,0,0,0,0,0,0,0,0};
return 1;
}
public OnPlayerUpdate(playerid)
{
if (GetTickCount() - WeaponsChecked[playerid] > WEAPON_CHECK_INTERVAL) {
    for (new slot = 0; slot <= 12; slot++) {
        new weapon, ammo;
       GetPlayerWeaponData(playerid, slot, weapon, ammo);
       if (weapon != WeaponData[playerid][slot]) {
           CallRemoteFunction(\"OnPlayerReceiveWeapon\", \"iiii\", playerid, slot, weapon, ammo);
                WeaponData[playerid][slot] = weapon;
   }
}
WeaponsChecked[playerid] = GetTickCount();
}
return 1;
}
« Utoljára szerkesztve: 2016. november 11. - 00:08:38 írta Basshunter »

Nem elérhető whadez

  • 719
  • DEFEATER
    • Profil megtekintése
Ha a játékos fegyvert kap
« Válasz #8 Dátum: 2016. november 11. - 00:25:58 »
+1 Show voters
Jaj nem, dehogy veszem sértésnek, azért vagyunk hogy segítsünk, főleg hogy ki is emeltem hogy \'nincs tesztelve\', én nem teszek nagyon semmit az OnPlayerUpdate-hez, mert tesztelések alatt előszeretetten elhal a játékmódom tőle +180 player környékén, így leszűkítettem teljesen mindent, hook-okat használok leginkább, és gondoltam hogy ez neki segíteni fog valamiben. :)  :wave:

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal