Szerző Téma: RPC plugin (RPG HUD RAK)  (Megtekintve 3038 alkalommal)

RPC plugin (RPG HUD RAK)
« Dátum: 2015. Április 09. - 16:31:15 »
+2
RAK
 
Sziasztok!
Egy nagyon hasznos plugint szeretnék nektek bemutatni, amivel olyan dolgokat lehet csinálni mint például eltüntetni a HUD-ot (cutscene mód) és SetPlayerGravity.
A plugin készítője bartekdvd, a r*ksamp és s*beit egyik szerkesztője/fejlesztője. Ő nem feltétlenül rombolni szeret samp-ban, egy pár hasznos dolgot is adott a szerverfejlesztőknek.
Videó a pluginnal létrehozott egykét szkriptről:
 

A letölthető csomagolt fájl 3 inc-et, a plugint és a plugin forráskódját tartalmazza. Ez a 3 inc a következő: RAK.inc tartalmazza a raknet funkciókat, ez tartalmazza az RPC plugin native-jait. RPG.inc, a videón látható NPC-s RPG lövölde, a RAKTOOLS.inc pedig a HUD eltüntető példaszkript.
Rövid info az RPC-ről:
A SA-MP kliens és szerver közötti kapcsolatot a RakNet hálózati motor biztosítja. Ez kifejezetten multiplayer játékokhoz lett elkészítve a jenkinssoftware által. Ez a motor interneten keresztül RPC (Remote Procedure Call) segítségével továbbít viszonylag rövid hosszúságú kódolt üzenetet a kliens és a szerver között. Az RPC maga az ID-je az adott funkciónak pl: SetGravity: 146. Ezt az RPC ID-t alapesetben a hálózatban lévő összes kliensnek elküldi, de ennek a pluginnak a segítségével egy playernek lehet elküldeni bármilyen RPC-t. Az id-k 0-tól 255 lehetnek kiosztva, ne kérdezzétek miért.  :facepalm: :facepalm:
RAK.inc:
 

native BitStream:InitBitStream();
native WriteToBitStream(BitStream:stream, type, {Float,_}:...);
native ReleaseBitStream(BitStream:stream);
native SendRPC(playerid, RPC, BitStream:stream);
native SendRPCToAll(RPC, BitStream:stream);
native SendData(playerid, BitStream:stream);
native SendDataToAll(BitStream:stream);
native AddTickSignal(index);
native RemoveTickSignal(index);
enum
{
BS_BOOL,
BS_CHAR,
BS_UCHAR,
BS_SHORT,
BS_USHORT,
BS_INT,
BS_UINT,
BS_FLOAT,
BS_STRING,
BSC_BOOL,
BSC_CHAR,
BSC_UCHAR,
BSC_SHORT,
BSC_USHORT,
BSC_INT,
BSC_UINT,
BSC_FLOAT,
BSC_STRING,
BS_NQUAT,
BS_VECTOR,
BS_ARRAY_BYTE,
BS_ARRAY_WORD,
BS_ARRAY_DWORD
};

 
A 0.3z RPC ID-k a következők (köszönet P3tinek aki mindig csak javítani akar a samp helyzetén):
 

/*
Updated to 0.3z by P3ti
*/
#include \"main.h\"
int RPC_ServerJoin = 137;
int RPC_ServerQuit = 138;
int RPC_InitGame = 139;
int RPC_ClientJoin = 25;
int RPC_NPCJoin = 54;
int RPC_Death = 53;
int RPC_RequestClass = 128;
int RPC_RequestSpawn = 129;
int RPC_SetInteriorId = 118;
int RPC_Spawn = 52;
int RPC_Chat = 101;
int RPC_EnterVehicle = 26;
int RPC_ExitVehicle = 154;
int RPC_DamageVehicle = 106;
int RPC_MenuSelect = 132;
int RPC_MenuQuit = 140;
int RPC_ScmEvent = 96;
int RPC_AdminMapTeleport = 255;
int RPC_WorldPlayerAdd = 32;
int RPC_WorldPlayerDeath = 166;
int RPC_WorldPlayerRemove = 163;
int RPC_WorldVehicleAdd = 164;
int RPC_WorldVehicleRemove = 165;
int RPC_SetCheckpoint = 107;
int RPC_DisableCheckpoint = 37;
int RPC_SetRaceCheckpoint = 38;
int RPC_DisableRaceCheckpoint = 39;
int RPC_UpdateScoresPingsIPs = 155;
int RPC_SvrStats = 102;
int RPC_GameModeRestart = 40;
int RPC_ConnectionRejected = 130;
int RPC_ClientMessage = 93;
int RPC_WorldTime = 94;
int RPC_Pickup = 95;
int RPC_DestroyPickup = 63;
int RPC_DestroyWeaponPickup = 97;
int RPC_Weather = 152;
int RPC_SetTimeEx = 255;
int RPC_ToggleClock = 30;
int RPC_ServerCommand = 50;
int RPC_PickedUpPickup = 131;
int RPC_PickedUpWeapon = 255;
int RPC_VehicleDestroyed = 136;
int RPC_DialogResponse = 62;
int RPC_PlayAudioStream = 41;
int RPC_StopAudioStream = 42;
int RPC_ClickPlayer = 23;
int RPC_PlayerUpdate = 60;
int RPC_ClickTextDraw = 83;
int RPC_MapMarker = 119;
int RPC_PlayerGiveTakeDamage = 115; // bool Give/Take, playerid, amount, weaponid
int RPC_EnterEditObject = 27;
int RPC_EditObject = 117;
int RPC_ScrSetSpawnInfo = 68;
int RPC_ScrSetPlayerTeam = 69;
int RPC_ScrSetPlayerSkin = 153;
int RPC_ScrSetPlayerName = 11;
int RPC_ScrSetPlayerPos = 12;
int RPC_ScrSetPlayerPosFindZ = 13;
int RPC_ScrSetPlayerHealth = 14;
int RPC_ScrPutPlayerInVehicle = 70;
int RPC_ScrRemovePlayerFromVehicle = 71;
int RPC_ScrSetPlayerColor = 72;
int RPC_ScrDisplayGameText = 73;
int RPC_ScrSetInterior = 156;
int RPC_ScrSetCameraPos = 157;
int RPC_ScrSetCameraLookAt = 158;
int RPC_ScrSetVehiclePos = 159;
int RPC_ScrSetVehicleZAngle = 160;
int RPC_ScrVehicleParams = 161;
int RPC_ScrSetCameraBehindPlayer = 162;
int RPC_ScrTogglePlayerControllable = 15;
int RPC_ScrPlaySound = 16;
int RPC_ScrSetWorldBounds = 17;
int RPC_ScrHaveSomeMoney = 18;
int RPC_ScrSetPlayerFacingAngle = 19;
int RPC_ScrResetMoney = 20;
int RPC_ScrResetPlayerWeapons = 21;
int RPC_ScrGivePlayerWeapon = 22;
int RPC_ScrRespawnVehicle = 255;
int RPC_ScrLinkVehicle = 65;
int RPC_ScrSetPlayerArmour = 66;
int RPC_ScrDeathMessage = 55;
int RPC_ScrSetMapIcon = 56;
int RPC_ScrDisableMapIcon = 144;
int RPC_ScrSetWeaponAmmo = 145;
int RPC_ScrSetGravity = 146;
int RPC_ScrSetVehicleHealth = 147;
int RPC_ScrAttachTrailerToVehicle = 148;
int RPC_ScrDetachTrailerFromVehicle = 149;
int RPC_ScrCreateObject = 44;
int RPC_ScrSetObjectPos = 45;
int RPC_ScrSetObjectRotation = 46;
int RPC_ScrDestroyObject = 47;
int RPC_ScrCreateExplosion = 79;
int RPC_ScrShowNameTag = 80;
int RPC_ScrMoveObject = 99;
int RPC_ScrStopObject = 122;
int RPC_ScrNumberPlate = 123;
int RPC_ScrTogglePlayerSpectating = 124;
int RPC_ScrSetPlayerSpectating = 255;
int RPC_ScrPlayerSpectatePlayer = 126;
int RPC_ScrPlayerSpectateVehicle = 127;
int RPC_ScrRemoveComponent = 57;
int RPC_ScrForceSpawnSelection = 74;
int RPC_ScrAttachObjectToPlayer = 75;
int RPC_ScrInitMenu = 76;
int RPC_ScrShowMenu = 77;
int RPC_ScrHideMenu = 78;
int RPC_ScrSetPlayerWantedLevel = 133;
int RPC_ScrShowTextDraw = 134;
int RPC_ScrHideTextDraw = 135;
int RPC_ScrEditTextDraw = 105;
int RPC_ScrAddGangZone = 108;
int RPC_ScrRemoveGangZone = 120;
int RPC_ScrFlashGangZone = 121;
int RPC_ScrStopFlashGangZone = 85;
int RPC_ScrApplyAnimation = 86;
int RPC_ScrClearAnimations = 87;
int RPC_ScrSetSpecialAction = 88;
int RPC_ScrEnableStuntBonus = 104;
int RPC_ScrSetFightingStyle = 89;
int RPC_ScrSetPlayerVelocity = 90;
int RPC_ScrSetVehicleVelocity = 91;
int RPC_ScrToggleWidescreen = 255;
int RPC_ScrSetVehicleTireStatus = 255;
int RPC_ScrSetPlayerDrunkLevel = 35;
int RPC_ScrDialogBox = 61;
int RPC_ScrCreate3DTextLabel = 36;

 
RPG.inc funkciók:
 

RPG_FireAimQuat(Float:vecFrom[3], Float:vecAim[3], Float:quat[4], Float:vecSpeed[3], skinId = 0, liveTime = 1000, worldId = -1, interiorId = -1, Float:stream_distance = 300.0);
RPG_FireQuat(Float:vecPos[3], Float:quat[4], Float:vecSpeed[3], skinId = 0, liveTime = 1000, worldId = -1, interiorId = -1, Float:stream_distance = 300.0);
RPG_FireAim(Float:vecFrom[3], Float:vecAim[3], Float:vecSpeed[3], skinId = 0, liveTime = 1000, worldId = -1, interiorId = -1, Float:stream_distance = 300.0);
RPG_FireFromTo(Float:vecFrom[3], Float:vecTo[3], Float:vecSpeed[3], skinId = 0, liveTime = 1000, worldId = -1, interiorId = -1, Float:stream_distance = 300.0);
RPG_FireRot(Float:vecPos[3], Float:vecSpeed[3], Float:vecRot[3], skinId = 0, liveTime = 1000, worldId = -1, interiorId = -1, Float:stream_distance = 300.0);
RPG_Fire(playerid);

 


RAKTOOLS.inc:

 

stock TogglePlayerHUD(playerid, bool:toggle);

 
A készítő azt írja, hogy ez aktiválja a szélesvásznú vagy cutscene módot, ami kikapcsolja a HUD-ot (a játékos nem tud a főmenübe lépni esc-el).
Ha a játékos 16:9-es képaránnyal játszik (1080p, 720p), akkor nem ad hozzá fekete csíkot alulra meg felülre. Ez a funkció a készítő szerint nem fog működni a következő verziókban mert Kalcor egy mocskos g*ci és kiveszi. SAMPDEVELOPER4LIFE!
Ez lenne pedig a SetPlayerGravity:
 

#define RPC_Gravity 146
stock SetPlayerGravity(playerid, Float:grav)
{
     new BitStream:stream = InitBitStream();
     WriteToBitStream(stream, BS_FLOAT, grav);
     SendRPC(playerid, RPC_Gravity, stream);
     ReleaseBitStream(stream);
}

 
Rejoin(lehet módosítani pár dolgot mint pl. lagcomp, cj futás) nem teszteltem, elvileg működik:
 

CMD:rejoin(playerid)
{
new BitStream:bs0 = InitBitStream();
WriteToBitStream(bs0,BS_INT,5);
SendRPC(playerid, 40, bs0);
ReleaseBitStream(bs0);
new BitStream:bs = InitBitStream();
WriteToBitStream(bs,BSC_BOOL,1); // m_bZoneNames
WriteToBitStream(bs,BSC_BOOL,1); // m_bUseCJWalk
WriteToBitStream(bs,BSC_BOOL,1); // m_bAllowWeapons
WriteToBitStream(bs,BSC_BOOL,0); // m_bLimitGlobalChatRadius
WriteToBitStream(bs,BS_FLOAT,200.00); // m_fGlobalChatRadius
WriteToBitStream(bs,BSC_BOOL,0); // bStuntBonus
WriteToBitStream(bs,BS_FLOAT,70.0); // m_fNameTagDrawDistance
WriteToBitStream(bs,BSC_BOOL,0); // m_bDisableEnterExits
WriteToBitStream(bs,BSC_BOOL,1); // m_bNameTagLOS
WriteToBitStream(bs,BSC_BOOL,0); // m_bManualVehicleEngineAndLight
WriteToBitStream(bs,BS_INT,1); // m_iSpawnsAvailable
WriteToBitStream(bs,BS_USHORT,playerid); // MyPlayerID
WriteToBitStream(bs,BSC_BOOL,1); // m_bShowPlayerTags
WriteToBitStream(bs,BS_INT,1); // m_iShowPlayerMarkers
WriteToBitStream(bs,BS_UCHAR,7); // m_byteWorldTime
WriteToBitStream(bs,BS_UCHAR,1); // m_byteWeather
WriteToBitStream(bs,BS_FLOAT,0.008); // m_fGravity
WriteToBitStream(bs,BSC_BOOL,0); // bLanMode
WriteToBitStream(bs,BS_INT,0); // m_iDeathDropMoney
WriteToBitStream(bs,BSC_BOOL,0); // m_bInstagib
WriteToBitStream(bs,BS_INT,40); // iNetModeNormalOnfootSendRate
WriteToBitStream(bs,BS_INT,40); // iNetModeNormalIncarSendRate
WriteToBitStream(bs,BS_INT,40); // iNetModeFiringSendRate
WriteToBitStream(bs,BS_INT,10); // iNetModeSendMultiplier
WriteToBitStream(bs,BS_UCHAR,1); // m_bLagCompensation
WriteToBitStream(bs,BS_UCHAR,0); // unknown
WriteToBitStream(bs,BS_UCHAR,0); // unknown
WriteToBitStream(bs,BS_UCHAR,0); // unknown
new svrname[50];
GetServerVarAsString(\"hostname\",svrname,50);
WriteToBitStream(bs,BS_UCHAR,strlen(svrname));
WriteToBitStream(bs,BS_STRING,svrname,strlen(svrname));
new vehModels[212];
WriteToBitStream(bs,BS_CHAR,vehModels);
SendRPC(playerid, 139, bs);
ReleaseBitStream(bs);
    SetPlayerVirtualWorld(playerid,10);
SetTimerEx(\"pworld\",1000,0,\"d\",playerid);
return 1;
}
forward pworld(playerid);
public pworld(playerid)
{
      SetPlayerVirtualWorld(playerid,0);
return 1;
}

 
Ui:
Nemhiszem, hogy a fórumon bárki értene a RakNethez kurtán és p3tin kívül, mivel a samp funkcióknak nem mindig ugyan az a paraméterszáma mint amit az RPC-vel elküld. Pl: a CreateObject és a CreatePlayerObject ugyan azt az RPC-t használja csak egyel több a paraméter, ami azt tartalmazza, hogy player object-e vagy nem. Nem vagyok biztos benne, de anno mikor 0.3x-en tesztelgettem erre a következtetésre jutottam.
A megfelelő paraméterek megkereséséhez egy módosított s0beitet használtam, ahol a HandleRPCPacketFunc alatt a kliensnek beérkező RPC-ket lehet kíirogatni. Jó lenne ha ezt a funkciót szerverben is létre lehetne hozni valami memóriahackeléssel de sajnos nem értek hozzá.
 

RPC: 44
Funkciók: CreateObject/CreatePlayerObject
Paraméterek:
BS_CHAR  - objectid, isplayerobject
BS_INT     - modelid
BS_FLOAT - X,Y,Z,RX,RY,RZ
Felépítés (0.3x-en teszteltem utoljára):
new BitStream:stream = InitBitStream();
WriteToBitStream(stream, BS_CHAR, objectid);
WriteToBitStream(stream, BS_CHAR, isplayerobject);
WriteToBitStream(stream, BS_INT, modelid);
WriteToBitStream(stream, BS_FLOAT, X);
WriteToBitStream(stream, BS_FLOAT, Y);
WriteToBitStream(stream, BS_FLOAT, Z);
WriteToBitStream(stream, BS_FLOAT, RX);
WriteToBitStream(stream, BS_FLOAT, RY);
WriteToBitStream(stream, BS_FLOAT, RZ);
SendRPC(playerid, 44, stream);
ReleaseBitStream(stream);

 
Letöltés:
http://www.mediafire.com/download/7hzeabygsrnml58/RPG.7z
« Utoljára szerkesztve: 2015. Április 14. - 22:01:08 írta anGeL »

Nem elérhető divkn

  • 3259
    • Profil megtekintése
RPC plugin (RPG HUD RAK)
« Válasz #1 Dátum: 2015. Április 13. - 20:45:21 »
0
Már csak minden klienstől érkező RPC adatokra kéne egy eljárás és minden fasza lenne.

RPC plugin (RPG HUD RAK)
« Válasz #2 Dátum: 2015. Április 13. - 22:43:20 »
0
Idézetet írta: Applejack date=1428950721\" data-ipsquote-contentapp=\"forums\" data-ipsquote-contenttype=\"forums\" data-ipsquote-contentid=\"53716\" data-ipsquote-contentclass=\"forums_Topic
Már csak minden klienstől érkező RPC adatokra kéne egy eljárás és minden f***a lenne.
 
Ezt már kurta megcsinálta a YSF-ben. RegisterAsRemoteProcedureCall-al a beérkező RPC-ket alakítja funkcióvá.
https://github.com/kurta999/YSF/blob/YSF_/src/RPCs.cpp
Bele kéne rakni ebbe a pluginba, csak sajnos nem értek hozzá  :-[

Nem elérhető kurta999

  • 2759
  • Éllő fédisznó
    • Profil megtekintése
RPC plugin (RPG HUD RAK)
« Válasz #3 Dátum: 2015. Április 14. - 21:58:45 »
0
Azzal csak új RPC-khez tudsz hozzárendelni egy funkciót vagy meglévőket lecserélni, a létrehozottakkal a törlésen kívül mást nemtudsz velük csinálni. Erre kéne egy ProcessNetworkPacket hook a raknetbe és meg is lenne.

 

SimplePortal 2.3.7 © 2008-2024, SimplePortal