GTA Közösség - A magyar GTA fórum
San Andreas Multiplayer (SA-MP) => SA-MP: Szerverfejlesztés => A témát indította: Zsolesszka - 2011. július 24. - 00:56:32
-
Download:
http://solidfiles.com/d/ed99/
Hiba javítva.
Letöltés v1.1
http://solidfiles.com/d/4a198/
Nincs for ciklus.
Igazán talán roleplay módokban használják ezt a funkciót többet, egyszerre egy jármû azonosító szám megadásával ellenõrizhetõ van-e játékos jármûvezetõként a jármûben.
Test script:
[pawn]
#include <a_samp>
#define FILTERSCRIPT
#include <zcmd>
#include <getvehicledriver>
#if defined FILTERSCRIPT
public
OnFilterScriptInit()
{
#else
public
OnGameModeInit()
{
#endif
return 1;
}
// test command
COMMAND:getvehicledriver(playerid, params[])
{
if(isnull(params)) return SendClientMessage(playerid, -1, \"Usage: /getvehicledriver [vehicleid 1 - 2000]\");
new
str[128],
player1 = GetVehicleDriver(strval(params));
if(player1 != INVALID_PLAYER_ID)
{
new
PlayerN[MAX_PLAYER_NAME];
GetPlayerName(player1, PlayerN, 24);
format(str, sizeof str, \"VehicleDriver vehicleid: %d | playerid: %d | PlayerName: %s\", GetPlayerVehicleID(player1), player1, PlayerN);
SendClientMessage(playerid, -1, str);
} else {
SendClientMessage(playerid, -1, \"No player is the driver as\"); // Sorry google translate
}
return 1;
}
/*
//old code:
stock
GetVehicleDriver(vehicleid) by.: forum.sa-mp.com user
{
for(new i; i < 500; i++)
{
if(!IsPlayerConnected(i)) continue;
if(GetPlayerState(i) != PLAYER_STATE_DRIVER) continue;
if(GetPlayerVehicleID(i) == vehicleid)
{
return i;
}
}
return -1;
}
*/
[/pawn]
És azoknak akik nem akarnak még egy plussz .inc fájlt de használni szeretnék ezt a funkciót itt a kód amit csak be kell ágyazni a gamemod-ba vagy filterscript-be:
[pawn]
#include <a_samp>
/*
GetVehicleDriver function by Zsolesszka aka Phento v1.1
Date 2011.07.23
Example put In OnGameModeInit Or OnFilterScriptInit
*/
static
VehicleDriverPlayerid[MAX_VEHICLES] = { INVALID_PLAYER_ID, ... };
//------------------------------------------------------------------------------
stock
GetVehicleDriver(vehicleid)
{
if(vehicleid < 1 || vehicleid > sizeof(VehicleDriverPlayerid)) return INVALID_PLAYER_ID; // invalid array
if(VehicleDriverPlayerid[vehicleid - 1] != INVALID_PLAYER_ID && IsPlayerInVehicle(VehicleDriverPlayerid[vehicleid - 1], vehicleid) && GetPlayerVehicleSeat(VehicleDriverPlayerid[vehicleid - 1]) == 0)
return VehicleDriverPlayerid[vehicleid - 1]; // return playerid vehicledriver
return VehicleDriverPlayerid[vehicleid - 1] = INVALID_PLAYER_ID;
}
//------------------------------------------------------------------------------
public
OnPlayerStateChange(playerid, newstate, oldstate)
{
// ->
if(newstate == PLAYER_STATE_DRIVER)
{
new
vehicleid = GetPlayerVehicleID(playerid);
if(vehicleid)
{
VehicleDriverPlayerid[vehicleid - 1] = playerid;
}
}
//-<
return 1;
}
//------------------------------------------------------------------------------
[/pawn]
Hiba javítva, a hiba abból állt ha egy jármû vezetõje voltam és utána egy másiké is akkor hibás adat maradt vissza hogy én még mindig az elõzõ jármû vezetõje is vagyok. Ezt sikerült kiküszöbölni az IsPlayerInVehicle függvénnyel ami ellenõrzi hogy az adott jármûben is van-e a játékos.
-
jó lett
-
Köszi amúgy onnan jött az ötlet hogy épp láttam a hivatalos fórumon Jernelj által készített plugint és abban arra volt a panasz hogy pont ez a funkció milyen lassú is c++ ban mint pawnban de az oka valószínû az invoke (samp funkciók pluginban).
Azt végig gondoltam hogy minek is kell egyáltalán for ciklus azért hogy ellenõrizhessük hogy egy jármûben tartózkodik-e játékos sofõrként, mikor lehetne tárolni is ezt az információt jármûvenként hogy épp ki ült a volán mögé. Majd ennek a változónak az értékét vissza kapni, helyesen.
Igaz csak akkor hasznos ha elég sokat van használva mert azért itt egy 2000-es nagyságú változóról van szó. 8)
-
Jo lett! ;D