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:
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;
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:
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á.
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á :-[
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.