From c8d7f7d76000077592afe8fc654977462027d70d Mon Sep 17 00:00:00 2001 From: SchnitzelPommes <41128311+SchnitzelPommes@users.noreply.github.com> Date: Sun, 20 Jan 2019 20:57:25 +0100 Subject: [PATCH] Update to Ver. 1.30 Update to Ver. 1.30 --- CHANGELOG.md | 14 +- DayZ-Sa-Tomato/Config/Admins.txt | 2 - .../Config/List/TeleportLocation.txt | 18 - DayZ-Sa-Tomato/Config/Test.txt | 1 - DayZ-Sa-Tomato/Keys/SchnitzelPommes.bikey | Bin 168 -> 168 bytes DayZ-Sa-Tomato/addons/DayZ-SA-Tomato.pbo | Bin 187415 -> 303872 bytes .../DayZ-SA-Tomato.pbo.SchnitzelPommes.bisign | Bin 568 -> 568 bytes DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$MIKERO$ | 1 - DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$PREFIX$ | 2 +- .../addons/DayZ-SA-Tomato/$VERSION$ | 1 - .../addons/DayZ-SA-Tomato/config.bin | Bin 655 -> 0 bytes .../DayZ-SA-Tomato/scripts/4_World/COMCam.c | 265 ------- .../scripts/5_Mission/M_MissionGameplay.c | 81 ++- .../scripts/5_Mission/M_MissionServer.c | 338 ++------- .../core/FileHandeling/FileHandler.c | 98 --- .../5_Mission/core/FileHandeling/FileReader.c | 4 - .../5_Mission/core/modules/AdminMenu.c | 688 +++++++++--------- .../5_Mission/core/modules/AdminMenuManager.c | 112 ++- .../scripts/5_Mission/core/modules/DevCam.c | 71 +- .../5_Mission/core/modules/DevTeleport.c | 4 +- .../core/modules/GUI/AdminMenuCommands.c | 46 +- .../5_Mission/core/modules/GUI/AdminMenuGui.c | 356 +++++---- .../5_Mission/core/modules/GUI/AdminMenuMap.c | 139 +++- .../core/modules/GUI/AdminMenuPlayer.c | 114 ++- .../core/modules/GUI/AdminMenuSpawn.c | 57 +- .../core/modules/GUI/AdminMenuTeleport.c | 234 +++--- .../modules/GUI/Layouts/Admin_Commands.layout | 46 +- .../modules/GUI/Layouts/Admin_Config.layout | 97 --- .../modules/GUI/Layouts/Admin_Main.layout | 33 +- .../core/modules/GUI/Layouts/Admin_Map.layout | 38 +- .../modules/GUI/Layouts/Admin_Player.layout | 17 +- .../modules/GUI/Layouts/Admin_Teleport.layout | 32 +- .../Tomato_Profiles/Config/Config.txt | 18 + .../Customization/Teleport_Locations.txt | 18 + Dayz-Sa-Tomato/Tomato_Profiles/Log/Admin.txt | 1 + Dayz-Sa-Tomato/Tomato_Profiles/Log/Debug.txt | 2 + Dayz-Sa-Tomato/Tomato_Profiles/Log/Error.txt | 1 + Dayz-Sa-Tomato/Tomato_Profiles/Log/Info.txt | 1 + Dayz-Sa-Tomato/Tomato_Profiles/Log/Kills.txt | 1 + .../DayZ-SA-Tomato.pbo.SchnitzelPommes.bisign | Bin 0 -> 568 bytes .../addons/DayZ-SA-Tomato/config.cpp | 63 ++ .../scripts/3_Game/Moddedconstants.c | 2 + .../FileHandeling/Config/ConfigTypes.c | 23 + .../4_World/FileHandeling/Config/FileConfig.c | 289 ++++++++ .../FileHandeling/Player/FPPermission.c | 269 +++++++ .../4_World/FileHandeling/Player/FPPlayer.c | 204 ++++++ .../FileHandeling/Player/PermissionSystem.c | 108 +++ .../FileHandeling/Player/PermissionType.c | 19 + .../4_World/FileHandeling/Player/PlayerData.c | 81 +++ .../FileHandeling/Tp_Locations/FileTeleport.c | 187 +++++ .../FileHandeling/Tp_Locations/TeleportData.c | 91 +++ .../scripts/4_World/LogSystem/DeathHandler.c | 296 ++++++++ .../scripts/4_World/LogSystem/LogHandler.c | 435 +++++++++++ .../DayZ-SA-Tomato/scripts/4_World}/M_RPCs.c | 48 +- .../4_World/ModdedClasses/EmoteManager.c | 28 + .../4_World/ModdedClasses/PlayerBase.c | 84 +++ .../4_World/ModdedClasses/SurvivorBase.c | 45 ++ .../scripts/4_World/Modules/FileHandler.c | 482 ++++++++++++ .../5_Mission/core/modules/ChatModule.c | 143 ++++ .../core/modules/Files/Config/ConfigModule.c | 66 ++ .../modules/Files/Player/PermissionBase.c | 168 +++++ .../core/modules/Files/Player/PlayerModule.c | 591 +++++++++++++++ .../modules/Files/Teleport/TeleportModule.c | 33 + .../core/modules/GUI/AdminMenuAbout.c | 44 ++ .../core/modules/GUI/AdminMenuMessage.c | 79 ++ .../modules/GUI/Layouts/Admin_About.layout | 219 ++++++ .../modules/GUI/Layouts/MessageBox.layout | 37 + .../5_Mission/core/modules/HordeModule.c | 152 ++++ README.md | 180 +++-- 69 files changed, 5878 insertions(+), 1539 deletions(-) delete mode 100644 DayZ-Sa-Tomato/Config/Admins.txt delete mode 100644 DayZ-Sa-Tomato/Config/List/TeleportLocation.txt delete mode 100644 DayZ-Sa-Tomato/Config/Test.txt delete mode 100644 DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$MIKERO$ delete mode 100644 DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$VERSION$ delete mode 100644 DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/config.bin delete mode 100644 DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/COMCam.c delete mode 100644 DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/FileHandeling/FileHandler.c delete mode 100644 DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/FileHandeling/FileReader.c delete mode 100644 DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Config.layout create mode 100644 Dayz-Sa-Tomato/Tomato_Profiles/Config/Config.txt create mode 100644 Dayz-Sa-Tomato/Tomato_Profiles/Customization/Teleport_Locations.txt create mode 100644 Dayz-Sa-Tomato/Tomato_Profiles/Log/Admin.txt create mode 100644 Dayz-Sa-Tomato/Tomato_Profiles/Log/Debug.txt create mode 100644 Dayz-Sa-Tomato/Tomato_Profiles/Log/Error.txt create mode 100644 Dayz-Sa-Tomato/Tomato_Profiles/Log/Info.txt create mode 100644 Dayz-Sa-Tomato/Tomato_Profiles/Log/Kills.txt create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/DayZ-SA-Tomato.pbo.SchnitzelPommes.bisign create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/config.cpp create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/3_Game/Moddedconstants.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Config/ConfigTypes.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Config/FileConfig.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/FPPermission.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/FPPlayer.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PermissionSystem.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PermissionType.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PlayerData.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Tp_Locations/FileTeleport.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Tp_Locations/TeleportData.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/LogSystem/DeathHandler.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/LogSystem/LogHandler.c rename {DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission => Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World}/M_RPCs.c (60%) create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/EmoteManager.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/PlayerBase.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/SurvivorBase.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/Modules/FileHandler.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/ChatModule.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Config/ConfigModule.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Player/PermissionBase.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Player/PlayerModule.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Teleport/TeleportModule.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuAbout.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuMessage.c create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_About.layout create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/MessageBox.layout create mode 100644 Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/HordeModule.c diff --git a/CHANGELOG.md b/CHANGELOG.md index 8156ea5..b4c7f1f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,17 +2,16 @@ All notable changes to this project will be documented in this file. -## 01.12.2018 23:00 +## 15.12.2018 23:00 ### Fixed -- No CustomMission is Created anymore this means Init.c File works now (Custom loadout and mods Using this file) -- This means there should be no incompatibility with any mod now -## 01.12.2018 23:00 +- For 1.0 Update (make sure to kopy the Key from Keys folder again !) + +### Added + +- Teleport Locations Check the Config/List Folder u can add your own Locations to it (Adding Locations from ingame does not work since filewrite is bugged at the moment) -### Fixed -- No CustomMission is Created anymore this means Init.c File works now (Custom loadout and mods Using this file) -- This means there should be no incompatibility with any mod now ## 29.11.2018 23:00 @@ -47,3 +46,4 @@ Addet bikey you should be able to use the mod without Dissableing verifySignatur ### Release Initial Release + diff --git a/DayZ-Sa-Tomato/Config/Admins.txt b/DayZ-Sa-Tomato/Config/Admins.txt deleted file mode 100644 index 359025e..0000000 --- a/DayZ-Sa-Tomato/Config/Admins.txt +++ /dev/null @@ -1,2 +0,0 @@ -76561198161388867 -76561198017833573 diff --git a/DayZ-Sa-Tomato/Config/List/TeleportLocation.txt b/DayZ-Sa-Tomato/Config/List/TeleportLocation.txt deleted file mode 100644 index d0fa773..0000000 --- a/DayZ-Sa-Tomato/Config/List/TeleportLocation.txt +++ /dev/null @@ -1,18 +0,0 @@ -Prison Island;2651.42 0.0 1395.8 -Mogilevka;7572.65 0.0 5182.3 -Stary Sobor;6192.39 0.0 7666.5 -Msta;11206.6 0.0 5398.70 -Solnichniy;13436.5 0.0 6158.7 -Chernogorsk;6350.99 0.0 2666.12 -Elektrogorsk;10432.1 0.0 2218.56 -Berezino;12661.4 0.0 9465.03 -Tisy;1890.45 0.0 13704.6 -Gorka;9678.94 0.0 8828.93 -Balota;4546.92 0.0 2416.4 -Vybor;3916.85 0.0 8795.59 -Severograd;8318.51 0.0 12743.4 -North West Airfield;4835.59 0.0 9667.72 -Green Mountain;3752.08 0.0 6002.94 -Zelenogorsk;2542.18 0.0 4994.26 -Tisy Military Base;1599.15 0.0 14166.66 -Pavlovo Military Base;2047.82 0.0 3293.36 \ No newline at end of file diff --git a/DayZ-Sa-Tomato/Config/Test.txt b/DayZ-Sa-Tomato/Config/Test.txt deleted file mode 100644 index d012d14..0000000 --- a/DayZ-Sa-Tomato/Config/Test.txt +++ /dev/null @@ -1 +0,0 @@ -TestString \ No newline at end of file diff --git a/DayZ-Sa-Tomato/Keys/SchnitzelPommes.bikey b/DayZ-Sa-Tomato/Keys/SchnitzelPommes.bikey index 24edca7c5aff747af5975464fc0154cde17390eb..60e40919e619250b5d62662528957268401daf14 100644 GIT binary patch delta 136 zcmV;30C)eW0jL3xD1RBDCb!&6knImyRUKPf>hrl91fN%}X408&Zb}n?ajRCOu4ncqb delta 136 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 G>HiM|J&xx9 diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato.pbo.SchnitzelPommes.bisign b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato.pbo.SchnitzelPommes.bisign index beac6cf8269bb9555f0290d2059b3c621aa1b503..402641bd2e04c2aa18ecf35e12c33e32f6ee3598 100644 GIT binary patch delta 539 zcmV+$0_6R;1h@o{D1RBDCb!&6knImyRUKPf>hrl91fN%}X408&Zb}n?ajeoF!0001Eha7ES);e0H zre3vxsJkvo5}?m=o$wCJ0Ys(K)p+jg6CmU51TuipH){KXSHq@WiY&oGV}kR$kZaQ< zjl0a^!uk2v>J`}6;2}&o_1#_i$cT?Wxgpi*AYv~MQ$vM0~`qz|aoI-yr`x>-_+=X=jT_%*Oo>KuD z2@S!G(eO{=zOWqEagL^oF#eV37y>_(N7)cR&y_fk+|O#7Mx_a#xqpe6*-ixbuSEVW duc(mz85Ff&=;q#9pq|Z~AfF*vD%NdwLTg{W44nV~ delta 539 zcmV+$0_6R;1h@o{D1U{bAZ=_KdQ)YIo@7CMpK=4Lp5E?>v&-pF$7XfV{c=Q)9fx05 zm@V8&CC2Dgt z`cvlD+Cw@*o_f|}J@u7vVzkVTZ5K9nrH81#G)7T0e6Uov%LfOE8$}z7og|@kiN0aGDnZMm6winQ#jp(Un2)g- zfg)d-ojyTWr%G|eGZmqqy18r#>0eZTVOo6Tm%74`VKtV7c4}t+qOOc(U&b@6%A^nN zSz{XsMqd4zLVt`-Y=&hH0ssI2fB*mh8XFhL&$Tax@L=3v&usq>DqLFr>&C(ZYPHF5q5NpTxVfz?roDqyl1^iP26(zVsuY8M-nupf*LPev_}yoT)p-jj dfw-Ng))e(72Xdr88N-z~3OyJV?2t0>Xnf180(t-d diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$MIKERO$ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$MIKERO$ deleted file mode 100644 index ce31d01..0000000 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$MIKERO$ +++ /dev/null @@ -1 +0,0 @@ -DePbo.dll.6.44 \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$PREFIX$ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$PREFIX$ index 4dc715e..6c342f1 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$PREFIX$ +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$PREFIX$ @@ -1 +1 @@ -com\DayZ-Sa-Tomato \ No newline at end of file +com\DayZ-SA-Tomato \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$VERSION$ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$VERSION$ deleted file mode 100644 index 72e6b05..0000000 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/$VERSION$ +++ /dev/null @@ -1 +0,0 @@ -18121423 \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/config.bin b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/config.bin deleted file mode 100644 index 230b7b3291ea9b1ad27bd591f8e0762e80649b10..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmb7BK~BRk5FEQ4IC0?}rJ%x*Lq#QoP^(HsAaSXzc-vY^;$STu-d_cyC7p#%lXKA3fMY1&e#e zV-H8NE=};vu_0C2lK+Ho^imr~`jMPBw#4^tcP(3Rq;(og>wjp!TDcPeZCujq&qw{e zsz7D3P&;A~s4PTo2)Qt@9 diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/COMCam.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/COMCam.c deleted file mode 100644 index dc0b219..0000000 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/COMCam.c +++ /dev/null @@ -1,265 +0,0 @@ -modded class DayZSpectator -{ - protected float forwardVelocity; - protected float strafeVelocity; - protected float altitudeVelocity; - - protected float yawVelocity; - protected float pitchVelocity; - - protected float m_CamDrag = 0.95; - - protected float m_CamFOV = 1.0; // default FOV - protected float m_TargetFOV = 1.0; - protected float m_TargetRoll; - protected float m_DistanceToObject; - protected bool m_FollowTarget = false; - protected bool m_FreezePlayer = false; - protected bool m_OrbitalCam = false; - protected bool m_FreezeCam = false; - - protected bool m_FreezeMouse = false; - - static float CAMERA_FOV = 1.0; - static float CAMERA_TARGETFOV = 1.0; - static float CAMERA_FOV_SPEED_MODIFIER = 6.0; - static float CAMERA_SPEED = 2.0; - static float CAMERA_MAXSPEED = 1.0; - static float CAMERA_VELDRAG; - static float CAMERA_MSENS = 0.8; // acceleration - static float CAMERA_SMOOTH = 0.8; // drag - - static bool CAMERA_DOF = false; - static bool CAMERA_AFOCUS = true; - static float CAMERA_BLUR = 0.0; // modified via ui - static float CAMERA_FLENGTH = 50.0; // modified via ui - static float CAMERA_FNEAR = 50.0; // modified via ui - static float CAMERA_FDIST = 0.0; - static float CAMERA_DOFFSET = 0.0; - - static float CAMERA_SMOOTH_BLUR = 0.0; - - protected vector m_CamOffset; - - protected Object m_Target; - protected vector m_TargetPos; // Static position - - protected float m_CurrentSmoothBlur; - - override void EOnFrame(IEntity other, float timeSlice) - { - // zoom camera - int i = GetMouseState( MouseState.WHEEL ); - - if ( i != 0 ) - { - if ( CTRL() ) - { - vector ori = GetOrientation(); - m_TargetRoll = ori[2] - Math.RAD2DEG * i*0.06; - } - else - { - m_TargetFOV-=i*0.06; // invert - if ( m_TargetFOV < 0.01 ) - { - m_TargetFOV = 0.01; - } - } - } - - if ( m_CamFOV != m_TargetFOV ) - { - m_CamFOV = Math.Lerp( m_CamFOV, m_TargetFOV, timeSlice*CAMERA_FOV_SPEED_MODIFIER ); - SetFOV( m_CamFOV ); - } - - vector oldOrient = GetOrientation(); - if ( oldOrient[2] != m_TargetRoll ) - { - oldOrient[2] = Math.Lerp( oldOrient[2], m_TargetRoll, timeSlice*CAMERA_FOV_SPEED_MODIFIER ); - SetOrientation( oldOrient ); - } - - // Camera movement - Input input = GetGame().GetInput(); - - if ( !m_FreezeCam ) - { - float forward = input.GetAction(UAMoveForward) - input.GetAction(UAMoveBack); // -1, 0, 1 - float strafe = input.GetAction(UATurnRight) - input.GetAction(UATurnLeft); - - float altitude = input.GetAction(UACarShiftGearUp) - input.GetAction(UACarShiftGearDown); - altitudeVelocity = altitudeVelocity + altitude * CAMERA_SPEED * timeSlice; - - Math.Clamp( altitudeVelocity, -CAMERA_MAXSPEED, CAMERA_MAXSPEED); - vector up = vector.Up * altitudeVelocity; - - vector direction = GetDirection(); - vector directionAside = vector.Up * direction; - - altitudeVelocity *= m_CamDrag; - - vector oldPos = GetPosition(); - - forwardVelocity = forwardVelocity + forward * CAMERA_SPEED * timeSlice; - strafeVelocity = strafeVelocity + strafe * CAMERA_SPEED * timeSlice; - - Math.Clamp ( forwardVelocity, -CAMERA_MAXSPEED, CAMERA_MAXSPEED); - Math.Clamp ( strafeVelocity, -CAMERA_MAXSPEED, CAMERA_MAXSPEED); - - vector forwardChange = forwardVelocity * direction; - vector strafeChange = strafeVelocity * directionAside; - - forwardVelocity *= m_CamDrag; - strafeVelocity *= m_CamDrag; - - vector newPos = oldPos + forwardChange + strafeChange + up; - - float surfaceY = GetGame().SurfaceY( newPos[0], newPos[2] ) + 0.25; - if ( newPos[1] < surfaceY ) - { - newPos[1] = surfaceY; - } - - SetPosition(newPos); - } - - if ( !m_FreezeMouse ) - { - float yawDiff = input.GetAction(UAAimHeadLeft) - input.GetAction(UAAimHeadRight); - float pitchDiff = input.GetAction(UAAimHeadDown) - input.GetAction(UAAimHeadUp); - - yawVelocity = yawVelocity + yawDiff * CAMERA_MSENS; - pitchVelocity = pitchVelocity + pitchDiff * CAMERA_MSENS; // 0.8 - - vector newOrient = oldOrient; - - Math.Clamp ( yawVelocity, -1.5, 1.5); - Math.Clamp ( pitchVelocity, -1.5, 1.5); - - newOrient[0] = newOrient[0] - Math.RAD2DEG * yawVelocity * timeSlice; - newOrient[1] = newOrient[1] - Math.RAD2DEG * pitchVelocity * timeSlice; - - yawVelocity *= CAMERA_SMOOTH; // drag 0.9 - pitchVelocity *= CAMERA_SMOOTH; - - if( newOrient[1] < -89 ) - newOrient[1] = -89; - if( newOrient[1] > 89 ) - newOrient[1] = 89; - - SetOrientation( newOrient ); - } - - - // Camera targetting - float dist = 0.0; - vector from = GetGame().GetCurrentCameraPosition(); - - if ( m_Target ) - { - vector targetPos; - - if ( m_Target.IsInherited( SurvivorBase ) ) - { - targetPos = GetTargetCenter(); - } - else - { - vector pos = m_Target.GetPosition(); - pos[1] = GetGame().SurfaceY(pos[0], pos[2]); - - vector clippingInfo; - vector objectBBOX; - - m_Target.GetCollisionBox(objectBBOX); - - pos[1] = (pos[1] - objectBBOX[1] + clippingInfo[1] - objectBBOX[1]) + 1.5; - - targetPos = pos; - } - - if ( m_OrbitalCam ) - { - LookAt( targetPos ); - } - - dist = vector.Distance( from, targetPos ); - - if ( m_FollowTarget ) - { - if ( m_DistanceToObject == 0.0 ) - { - m_DistanceToObject = vector.Distance(GetTargetCenter(), GetPosition()); - m_CamOffset = vector.Direction( GetTargetCenter() , GetPosition() ); - m_CamOffset.Normalize(); - } - - if ( m_OrbitalCam ) - { - direction = vector.Direction( GetTargetCenter() , GetPosition() ); - direction.Normalize(); - newPos = GetTargetCenter() + ( direction * m_DistanceToObject ); - } - else - { - newPos = GetTargetCenter() + ( m_CamOffset * m_DistanceToObject ); - } - - SetPosition( newPos ); - dist = m_DistanceToObject; - } - } - else if ( m_TargetPos != vector.Zero ) - { - LookAt( m_TargetPos ); // auto orbital - dist = vector.Distance( from, m_TargetPos ); - } - - if ( CAMERA_DOF ) // DOF enabled - { - if ( CAMERA_AFOCUS && !m_Target ) //auto focus - { - vector to = from + (GetGame().GetCurrentCameraDirection() * 9999); - vector contact_pos; - - DayZPhysics.RaycastRV( from, to, contact_pos, NULL, NULL, NULL , NULL, NULL, false, false, ObjIntersectIFire); - dist = vector.Distance( from, contact_pos ); - } - if ( dist > 0 ) CAMERA_FDIST = dist; - - PPEffects.OverrideDOF(true, CAMERA_FDIST, CAMERA_FLENGTH, CAMERA_FNEAR, CAMERA_BLUR, CAMERA_DOFFSET); - } - } - - vector GetTargetCenter() - { - vector targetPosition; - - if ( m_Target.IsInherited( SurvivorBase )) - { - targetPosition = m_Target.GetPosition(); - targetPosition[1] = targetPosition[1] + 1.5; - } - else - { - targetPosition = m_Target.GetPosition(); - targetPosition[1] = GetGame().SurfaceY(targetPosition[0], targetPosition[2]); - - vector clippingInfo; - vector objectBBOX; - - m_Target.GetCollisionBox(objectBBOX); - - targetPosition[1] = (targetPosition[1] - objectBBOX[1] + clippingInfo[1] - objectBBOX[1]) + 1.5; - } - - return targetPosition; - } -} - -static bool CTRL() // static functions arent scope global? -{ - return( ( KeyState( KeyCode.KC_LCONTROL ) > 0 ) || ( KeyState( KeyCode.KC_RCONTROL ) > 0 ) ); -} \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_MissionGameplay.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_MissionGameplay.c index f59daad..cd62514 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_MissionGameplay.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_MissionGameplay.c @@ -19,22 +19,37 @@ */ modded class MissionGameplay { + protected ref PermissionBase m_PermissionBase; ref DevTeleport devTeleport; + ref LogHandler m_LogHandler; + // ref AdminMenuGui m_AdminMenuGui; ref DevCam devCam; ref AdminMenu adminMenu; + ref TeleportData Tdata; ref AdminMenuManager adminMenuManager; - //ref AdminMenuMain AdminMenumain; - bool isSpectating = false; bool MenuOpen = false; + void MissionGameplay() { Print( " Mission Gameplay Constructor "); - + m_LogHandler = new ref LogHandler(); + // m_AdminMenuGui = new ref AdminMenuGui(); + // m_PermissionBase = new ref PermissionBase; devTeleport = new DevTeleport(); devCam = new DevCam(); adminMenu = new AdminMenu(); adminMenuManager = new AdminMenuManager(); + Tdata = new TeleportData(); + } + + void ~MissionGameplay() + { + delete Tdata; + delete m_LogHandler; + delete adminMenuManager; + delete adminMenu; + // delete m_PermissionBase; } override void OnInit() @@ -44,16 +59,34 @@ modded class MissionGameplay Print( " Mission Gameplay "); } - override void OnMissionStart() - { - super.OnMissionStart(); + // override void OnMissionStart() + // { - } + // super.OnMissionStart(); + // m_PermissionBase.OnStart(); + // GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Player_UpdatePlayers, new Param1( "" ), false, NULL ); + // } + + override void OnMissionFinish() + { + // m_PermissionBase.OnFinish(); + GetGame().GetUIManager().CloseMenu( MENU_INGAME ); + super.OnMissionFinish(); + } - override void OnKeyRelease( int key ) + + // override void OnUpdate( float timeslice ) + // { + // super.OnUpdate( timeslice ); + // m_PermissionBase.OnUpdate( timeslice ); + // } + + + + override void OnKeyPress (int key ) { - super.OnKeyRelease( key ); + super.OnKeyPress( key ); PlayerBase player = PlayerBase.Cast(GetGame().GetPlayer()); if ( key == KeyCode.KC_N ) { @@ -63,8 +96,31 @@ modded class MissionGameplay } } + if ( key == KeyCode.KC_DELETE ) + { + if(adminMenuManager.Spectate) + { + adminMenuManager.CamSpectate(adminMenuManager.Spectate, "", false, vector.Zero, false); + adminMenuManager.Spectate = !adminMenuManager.Spectate; + return; + } + + if(isSpectating) + { + adminMenuManager.CamTeleport( isSpectating, vector.Zero, false ); + isSpectating = !isSpectating; + } + + } + if ( key == KeyCode.KC_INSERT ) - { + { + if(adminMenuManager.Spectate) + { + adminMenuManager.CamSpectate(adminMenuManager.Spectate, "", true, GetCursorPos(), false ); + adminMenuManager.Spectate = !adminMenuManager.Spectate; + return; + } adminMenuManager.CamTeleport( isSpectating, GetCursorPos() ); isSpectating = !isSpectating; } @@ -74,7 +130,10 @@ modded class MissionGameplay { if ( player ) { - GetPlayer().MessageStatus( "Admin Menue Is Client" ); + //GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", "DayZ-Sa-Tomato", "")); + Widget widget = g_Game.GetUIManager().GetWidgetUnderCursor(); + // Print("TL funx"); + // TL().playerSetup(); adminMenuManager.MenuOpen(); } } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_MissionServer.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_MissionServer.c index 6c0374b..0ce30f2 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_MissionServer.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_MissionServer.c @@ -3,8 +3,6 @@ Copyright (C) 2018 DayZ-SA-Tomato This file is part of DayZ SA Tomato. - Originally from DayZCommunityOfflineMode - Link : https://github.com/Arkensor/DayZCommunityOfflineMode DayZ SA Tomato is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -21,86 +19,66 @@ */ modded class MissionServer { - protected bool m_bLoaded; + protected ref PermissionBase m_PermissionBase; + protected ref ConfigModule m_ConfigModule; + protected ref TeleportModule m_TeleportModule; + protected ref FileHandler m_FileHandler; + protected ref HordeModule m_HordeModule; + protected bool m_bLoaded; + //ref LogHandler m_LogHandler; ref DevTeleport devTeleport; - ref FileHandler fileHandler; ref AdminMenu adminMenu; ref DevCam devCam; - protected float m_LogInTimerLength1 = 1; + ref TeleportData Tdata; + ref ChatModules m_ChatModule; //admin list + ref PlayerModule PModule; PlayerBase Admin = NULL; - protected ref map m_AdminList; - static ref map m_StaminaList; - protected string m_AdminListPath = "$CurrentDir:\\DayZ-SA-Tomato\\Config\\"; - protected string m_AdminListPath2 = "$CurrentDir:\\@DayZ-SA-Tomato\\Config\\"; void MissionServer() { - //super.MissionServer(); + //m_LogHandler = new ref LogHandler(); + m_FileHandler = new ref FileHandler(); + m_HordeModule = new ref HordeModule(); + m_PermissionBase = new ref PermissionBase; + m_ConfigModule = new ref ConfigModule; + m_ChatModule = new ref ChatModules; + m_TeleportModule = new ref TeleportModule; Print( "Dayz-Sa-Tomato initialized .." ); - m_bLoaded = false; devTeleport = new DevTeleport(); - fileHandler = new FileHandler(); + PModule = new PlayerModule(); adminMenu = new AdminMenu(); devCam = new DevCam(); + //Tdata = new TeleportData(); } void ~MissionServer() { - Print( "CommunityOfflineServer::~CommunityOfflineServer()" ); + + delete PModule; + delete adminMenu; + delete m_PermissionBase; + Print( "CommunityOfflineServer::~CommunityOfflineServer()" ); } - void WelcomeMswgClient() - { - GetPlayer().MessageStatus( "Client Mod active and functional." ); - } - - //Create Mags And Custom Guns - void addMags(PlayerBase player, string mag_type, int count) - { - if (count < 1) - return; - - EntityAI mag; - - for (int i = 0; i < count; i++) { - mag = player.GetInventory().CreateInInventory(mag_type); - } - - player.SetQuickBarEntityShortcut(mag, 1, true); - } - EntityAI SVD(int ground, PlayerBase player) - { - EntityAI item; - ItemBase itemBs - vector NewPosition; - vector OldPosition; - if (ground == 1) - { - OldPosition = player.GetPosition(); - NewPosition[0] = OldPosition[0] + 1.5; - NewPosition[1] = OldPosition[1] + 0.1; - NewPosition[2] = OldPosition[2] + 1.5; - EntityAI gun = EntityAI.Cast(GetGame().CreateObject( "SVD", NewPosition, false, true )); - gun.GetInventory().CreateAttachment("PSO1Optic"); - gun.GetInventory().CreateAttachment("ImprovisedSuppressor"); - gun.GetInventory().CreateAttachment("GhillieAtt_Tan"); - }else - { - EntityAI gun1 = player.GetHumanInventory().CreateInHands("SVD"); - gun1.GetInventory().CreateAttachment("PSO1Optic"); - gun1.GetInventory().CreateAttachment("ImprovisedSuppressor"); - gun1.GetInventory().CreateAttachment("GhillieAtt_Tan"); - addMags(player, "Mag_SVD_10Rnd", 3); - } - return gun; -} override void OnEvent(EventType eventTypeId, Param params) { super.OnEvent(eventTypeId,params); - - + //PlayerIdentity identity; + switch(eventTypeId) + { + case ChatMessageEventTypeID: + Print("Chat Event"); + ChatMessageEventParams chat_params = ChatMessageEventParams.Cast(params); + //chat_params.param1 == 0 && + if (chat_params.param2 != "") //trigger only when channel is Global == 0 and Player Name does not equal to null + { + Param4 request_info = new Param4(chat_params.param1, chat_params.param2, chat_params.param3, chat_params.param4); + GetChatModule().ChatHandler(request_info); //Send the param to Admintools + } + break; + } } @@ -127,19 +105,12 @@ modded class MissionServer PlayerPos = currentPlayer.GetPosition(); currentPlayer.OnTick(); - if (m_StaminaList.Contains(PlayerName)) + if(GetFileHandler().HasPermission("DisableStamina", PlayerIdent) { currentPlayer.GetStaminaHandler().SyncStamina(1000,1000); currentPlayer.GetStatStamina().Set(currentPlayer.GetStaminaHandler().GetStaminaCap()); - } - - if (IsAdmin(PlayerName, PlayerSteam64ID )) - { - currentPlayer.GetStaminaHandler().SyncStamina(1000,1000); - currentPlayer.GetStatStamina().Set(currentPlayer.GetStaminaHandler().GetStaminaCap()); - } - + m_currentPlayer++; @@ -168,7 +139,6 @@ modded class MissionServer vector pos; pos = currentPlayer.GetPosition(); - Print("CommunityOfflineServer - SendPosTOAdmins1/2() - Name :" + PlayerName + "pos : " + pos); //SendPosToAdmins(PlayerName, pos); m_currentPlayer1++; @@ -189,9 +159,8 @@ modded class MissionServer AdminIdent1 = currentPlayer1.GetIdentity(); AdminPlayerName1 = AdminIdent1.GetName(); PlayerSteam64ID1 = AdminIdent1.GetPlainId(); - if (IsAdmin(AdminPlayerName1, PlayerSteam64ID1 )) + if (GetFileHandler().HasPermission("Admin", AdminIdent1)) { - Print("CommunityOfflineServer - SendPosTOAdmins2/2() - Name :" + PlayerName + "pos : " + pos); ScriptRPC PPos = new ScriptRPC(); PPos.Write(PlayerName); PPos.Write(pos); @@ -203,144 +172,37 @@ modded class MissionServer } } - void SendPlayerListToAdmins() - { - int m_currentPlayer1; - array players = new array; - GetGame().GetPlayers( players ); - - for (int i = 0; i < players.Count(); ++i) - { - if(m_currentPlayer1 >= m_Players.Count() ) - { - m_currentPlayer1 = 0; - } - PlayerBase currentPlayer = PlayerBase.Cast(m_Players.Get(m_currentPlayer1)); - string PlayerName; - PlayerIdentity PlayerIdent; - string PlayerSteam64ID; - PlayerIdent = currentPlayer.GetIdentity(); - PlayerName = PlayerIdent.GetName(); - PlayerSteam64ID = PlayerIdent.GetPlainId(); - Print("CommunityOfflineServer - SendPlayerListToAdmins() - Name :" + PlayerName + "m_currentPlayer1 : " + m_currentPlayer1); - //SendPosToAdmins(PlayerName, pos); - m_currentPlayer1++; - - int m_currentPlayer2 = 0; - array players1 = new array; - GetGame().GetPlayers( players1 ); - - for (int i1 = 0; i1 < players1.Count(); ++i1) - { - if(m_currentPlayer2 >= m_Players.Count() ) - { - m_currentPlayer2 = 0; - } - PlayerBase currentPlayer1 = PlayerBase.Cast(m_Players.Get(m_currentPlayer2)); - string AdminPlayerName1; - PlayerIdentity AdminIdent1; - string PlayerSteam64ID1; - AdminIdent1 = currentPlayer1.GetIdentity(); - AdminPlayerName1 = AdminIdent1.GetName(); - PlayerSteam64ID1 = AdminIdent1.GetPlainId(); - if (IsAdmin(AdminPlayerName1, PlayerSteam64ID1 )) - { - ScriptRPC PList = new ScriptRPC(); - PList.Write(PlayerName); - PList.Send(NULL, M_RPCs.M_Admin_Menu_Player_List, false, AdminIdent1); - } - m_currentPlayer2++; - } - - - } - } - - void AddStamina(string name) - { - m_StaminaList.Insert(name, "null"); - } - - void RemoveStamina(string name) - { - m_StaminaList.Remove(m_StaminaList.GetKeyByValue(name)); - } - bool StaminaContains(string name) - { - if (m_StaminaList.Contains(name)) - { - return true; - } - return false; - } - - - - - - PlayerBase IsAdminID(string name, string ID ) + PlayerBase IsAdminID(string name, PlayerIdentity ID ) { GetGame().GetWorld().GetPlayerList(m_Players); array players = new array; GetGame().GetPlayers( players ); - //PlayerBase currentPlayer; + PlayerIdentity CurIdent; + string id; int Count = 0; for (int i = 0; i < players.Count(); ++i) { - if(Count >= m_Players.Count() ) - { - Count = 0; - } - PlayerBase currentPlayer = PlayerBase.Cast(m_Players.Get(Count)); - Print("Current Player : " + currentPlayer.GetIdentity().GetName() + "Count : " + Count.ToString()); - if (currentPlayer.GetIdentity().GetName() == name && m_AdminList.Contains(ID)) + PlayerBase currentPlayer = PlayerBase.Cast(m_Players.Get(i)); + CurIdent = currentPlayer.GetIdentity(); + if(GetFileHandler().HasPermission("Admin", ID) && CurIdent.GetName() == name ) { Admin = currentPlayer; - //AdminIdentity = Admin.GetIdentity(); - //AdminUID = AdminIdentity.GetPlainId(); - Print("Returning True for : " + players.Get(i).GetIdentity().GetName() ); - return Admin; + break; }else { - Print("Returning False 1" ); Admin = NULL; } Count ++; } return Admin; } - - bool IsAdmin(string name, string ID ) - { - GetGame().GetWorld().GetPlayerList(m_Players); - array players = new array; - GetGame().GetPlayers( players ); - //PlayerBase currentPlayer; - int Count = 0; - for (int i = 0; i < players.Count(); ++i) - { - if(Count >= m_Players.Count() ) - { - Count = 0; - } - PlayerBase currentPlayer = PlayerBase.Cast(m_Players.Get(Count)); - if (currentPlayer.GetIdentity().GetName() == name && m_AdminList.Contains(ID)) - { - Admin = currentPlayer; - return true; - }else - Count ++; - } - return false; - } ref Man GetPlayerFromIdentity( PlayerIdentity identity ) { foreach( ref Man manBase : m_Players ) { - Print( "Getter: " + manBase + " : " + manBase.GetIdentity().GetName() + " : " + manBase.GetIdentity().GetId() + ":" + manBase.GetIdentity().GetPlainId()); if ( manBase.GetIdentity().GetPlayerId() == identity.GetPlayerId() ) { return manBase; @@ -352,51 +214,46 @@ modded class MissionServer override void OnInit() { super.OnInit(); - //SetupWeather(); + m_ConfigModule.Init(); + m_TeleportModule.Init(); - //Admin list Insert from text - m_AdminList = new map; //UID, name - m_StaminaList = new map; //UID, name - FileHandle AdminUIDSFile = OpenFile(m_AdminListPath + "Admins.txt", FileMode.READ); - FileHandle AdminUIDSFile2 = OpenFile(m_AdminListPath2 + "Admins.txt", FileMode.READ); - - if (AdminUIDSFile != 0) - { - string line_content = ""; - while ( FGets(AdminUIDSFile,line_content) > 0 ) - { - m_AdminList.Insert(line_content,"null"); //UID , NAME - Print("Adding Admin: "+ line_content + " To the Admin List!"); - } - CloseFile(AdminUIDSFile); - } - if (AdminUIDSFile2 != 0) - { - string line_content2 = ""; - while ( FGets(AdminUIDSFile2,line_content2) > 0 ) - { - m_AdminList.Insert(line_content2,"null"); //UID , NAME - Print("Adding Admin: "+ line_content2 + " To the Admin List!"); - } - CloseFile(AdminUIDSFile2); - } - } override void OnMissionStart() { super.OnMissionStart(); - - + + m_PermissionBase.OnStart(); } override void OnMissionFinish() { + m_PermissionBase.OnFinish(); - - super.OnMissionFinish(); + super.OnMissionFinish(); } + override void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime) + { + super.OnPreloadEvent( identity, useDB, pos, yaw, queueTime ); + GetFileHandler().GetPlayerByIdentity( identity ); + } + + override void InvokeOnConnect( PlayerBase player, PlayerIdentity identity) + { + super.InvokeOnConnect( player, identity ); + GetFileHandler().GetPlayerByIdentity( identity ); + + GetGame().SelectPlayer( identity, player ); + } + + override void InvokeOnDisconnect( PlayerBase player ) + { + GetFileHandler().PlayerLeft( player.GetIdentity() ); + + super.InvokeOnDisconnect( player ); + } + void OnMissionLoaded() { @@ -405,51 +262,10 @@ modded class MissionServer override void OnUpdate( float timeslice ) { super.OnUpdate( timeslice ); - - if( !m_bLoaded && !GetDayZGame().IsLoading() ) - { - m_bLoaded = true; - OnMissionLoaded(); - } + + //m_PermissionBase.OnUpdate( timeslice ); } - static void SetupWeather() - { - //Offical DayZ SA weather code - // Weather weather = g_Game.GetWeather(); - - // weather.GetOvercast().SetLimits( 0.0 , 2.0 ); - // weather.GetRain().SetLimits( 0.0 , 2.0 ); - // weather.GetFog().SetLimits( 0.0 , 2.0 ); - - // weather.GetOvercast().SetForecastChangeLimits( 0.0, 0.0 ); - // weather.GetRain().SetForecastChangeLimits( 0.0, 0.0 ); - // weather.GetFog().SetForecastChangeLimits( 0.0, 0.0 ); - - // weather.GetOvercast().SetForecastTimeLimits( 1800 , 1800 ); - // weather.GetRain().SetForecastTimeLimits( 600 , 600 ); - // weather.GetFog().SetForecastTimeLimits( 600 , 600 ); - - // weather.GetOvercast().Set( 0.0, 0, 0 ); - // weather.GetRain().Set( 0.0, 0, 0 ); - // weather.GetFog().Set( 0.0, 0, 0 ); - - // weather.SetWindMaximumSpeed( 50 ); - // weather.SetWindFunctionParams( 0, 0, 1 ); - } - - override void OnPreloadEvent(PlayerIdentity identity, out bool useDB, out vector pos, out float yaw, out int queueTime) - { - if (GetHive()) - { - queueTime = m_LogInTimerLength1; - } - else - { - queueTime = m_LogInTimerLength1; - } - } - void CLogInfo(string log) { int year, month, day, hour, minute, second; diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/FileHandeling/FileHandler.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/FileHandeling/FileHandler.c deleted file mode 100644 index 73da04c..0000000 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/FileHandeling/FileHandler.c +++ /dev/null @@ -1,98 +0,0 @@ -class FileHandler -{ - //Main Folder - string MainFolder = "$profile:\\Dayz-Sa-Tomato"; - string MainFolderPath = "$profile:\\Dayz-Sa-Tomato\\"; - //Config Folder and Files - string ConfigFolder = MainFolderPath + "Config"; - string ConfigFolderPath = MainFolderPath + "Config\\"; - string ConfigFile = ConfigFolderPath + "Config.txt"; - string AdminsFile = ConfigFolderPath + "Admins.txt"; - //Customization Folder and Files - string CustomizationFolder = MainFolderPath + "Customization"; - string CustomizationFolderPath = MainFolderPath + "Customization\\"; - string TeleportFile = CustomizationFolderPath + "Teleport_Locations.txt"; - - - - void FileHandler() - { - CheckAndCreateFiles(); - } - void CheckAndCreateFiles() - { - CheckFolder(MainFolder); - CheckFolder(ConfigFolder); - CheckFolder(CustomizationFolder); - - CheckFile(ConfigFile); - CheckFile(AdminsFile); - CheckFile(TeleportFile); - } - - void CheckFile(string File) - { - if(FileExist(File)) - { - GetServerMission().Print("FileHandler : File " + File + " found!"); - }else - { - FileHandle file = OpenFile(File, FileMode.APPEND); - if (file != 0) - { - FPrintln(file, " "); - CloseFile(file); - } - if(FileExist(File)) - { - if(File == TeleportFile) - { - CreateTeleportFile(); - }else - { - GetServerMission().Print("FileHandler : File " + File + " Created"); - } - } - } - } - - - void CheckFolder(string Folder) - { - if(FileExist(Folder)) - { - GetServerMission().Print("FileHandler : Folder " + Folder + " found!"); - }else - { - MakeDirectory(Folder); - if(FileExist(Folder)) - { - GetServerMission().Print("FileHandler : Folder " + Folder + " Created"); - } - } - } - - void CreateTeleportFile() - { - FileHandle file = OpenFile(TeleportFile, FileMode.APPEND); - if (file != 0) - { - FPrintln(file, "prison;2651.42 0.0 1395.8"); - FPrintln(file, "mogilevka;7572.65 0.0 5182.3"); - FPrintln(file, "stary;6192.39 0.0 7666.5"); - FPrintln(file, "msta;11206.6 0.0 5398.70"); - FPrintln(file, "solni;13436.5 0.0 6158.7"); - FPrintln(file, "cherno;6350.99 0.0 2666.12"); - FPrintln(file, "elektro;10432.1 0.0 2218.56"); - FPrintln(file, "berez;12661.4 0.0 9465.03"); - FPrintln(file, "tisy;1890.45 0.0 13704.6"); - FPrintln(file, "gorka;9678.94 0.0 8828.93"); - FPrintln(file, "balota;4546.92 0.0 2416.4"); - FPrintln(file, "vybor;3916.85 0.0 8795.59"); - FPrintln(file, "vybora;4107.80 0.0 11205.29"); - FPrintln(file, "severo;8318.51 0.0 12743.4"); - FPrintln(file, "severor;7986.21 0.0 12737.1"); - CloseFile(file); - } - } -} \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/FileHandeling/FileReader.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/FileHandeling/FileReader.c deleted file mode 100644 index e84ca7d..0000000 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/FileHandeling/FileReader.c +++ /dev/null @@ -1,4 +0,0 @@ -class FileReader -{ - -} \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/AdminMenu.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/AdminMenu.c index 85d79b8..e77231e 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/AdminMenu.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/AdminMenu.c @@ -1,4 +1,5 @@ /* + /* DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de Copyright (C) 2018 DayZ-SA-Tomato @@ -20,22 +21,34 @@ class AdminMenu //extends UIScriptedMenu { protected ref map m_TPLocations; - - ref AdminMenuGui m_adMenu; - ref AdminMenuGuiMap m_map; - ref AdminMenuManager adminMenuManager; + //ref UIScriptedMenu adminMenuGui; + //ref AdminMenuGui m_adMenu; + //ref AdminMenuMessage m_adMenuMessage; + //ref AdminMenuGuiMap m_map; PlayerBase Admin; PlayerIdentity AdminIdentity; string AdminUID; + //ref AdminMenuManager AMenuM; ref array m_Players; - + //ref LogHandler m_LogHandler; + + + + void AdminMenu() { GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); - adminMenuManager = new AdminMenuManager(); + //m_LogHandler = new ref LogHandler(); //adminMenuMain = new AdminMenuMain(); } + void ~AdminMenu() + { + //delete AMenuM; + //delete m_adMenu; + //delete m_LogHandler; + } + void Message (string strMessage) { Param1 Msgparam1; @@ -55,6 +68,7 @@ class AdminMenu //extends UIScriptedMenu string cData; ItemBase oItem = NULL; PlayerIdentity AdminIdent; + string status; bool ai = false; int Count = 0; @@ -65,107 +79,122 @@ class AdminMenu //extends UIScriptedMenu switch(rpc_type) { - - case M_RPCs.M_Admin_Menu_Log_Info: - string InfoLog; - Param1 stringParam1; - ctx.Read( stringParam1 ); - InfoLog = stringParam1.param1; - if ( GetGame().IsServer() ) - { - //GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu, new Param1( GetCursorPos() ), false, NULL ); - // permission check - server mission file - - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); - if ( Admin != NULL) - { - GetServerMission().CLogInfo(InfoLog); - } - } - break; - - case M_RPCs.M_Admin_Menu_Log_Debug: - string DebugLog; - Param1 stringParam2; - ctx.Read( stringParam2 ); - DebugLog = stringParam2.param1; - if ( GetGame().IsServer() ) - { - //GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu, new Param1( GetCursorPos() ), false, NULL ); - // permission check - server mission file - - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); - if ( Admin != NULL) - { - GetServerMission().Print(DebugLog); - } - } - break; - - case M_RPCs.M_Admin_Menu_Log_Startup: - string StartupLog; - Param1 stringParam3; - ctx.Read( stringParam3 ); - StartupLog = stringParam3.param1; - if ( GetGame().IsServer() ) - { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); - if ( Admin != NULL) - { - GetServerMission().CLogStartup(StartupLog); - } - } - break; - - case M_RPCs.M_Admin_Menu_Log_RPC: - string RPCLog; - Param1 stringParam4; - ctx.Read( stringParam4 ); - RPCLog = stringParam4.param1; - if ( GetGame().IsServer() ) - { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); - if ( Admin != NULL) - { - GetServerMission().CLogRPC(RPCLog); - } - } - break; - + case (int)M_RPCs.M_Admin_Menu: if ( GetGame().IsServer() ) { - GetServerMission().Print("M_RPCs.M_Admin_Menu - RPC Main sender : " + sender.GetName()); - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { - GetServerMission().Print("M_RPCs.M_Admin_Menu - Is Admin sender : " + sender.GetName() + "Admin name : " + Admin.GetIdentity().GetName()); AdminIdentity = Admin.GetIdentity(); - AdminUID = AdminIdentity.GetPlainId(); + AdminUID = AdminIdentity.GetId(); GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_OK, new Param1( "Test" ), false, AdminIdentity ); } } - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; + case (int)M_RPCs.M_Admin_Menu_MessageBox: + Param1 MenuMessagep; + ctx.Read( MenuMessagep ); + string MenuMessage = MenuMessagep.param1; + if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + { + //GetAdminMenuManager.MessageMenu(MenuMessage); + // UIScriptedMenu adminMenuMessage = NULL; + // adminMenuMessage = new AdminMenuMessage(MenuMessage); + + // if ( g_Game.GetUIManager().GetMenu() == NULL ) + // { + // g_Game.GetUIManager().ShowScriptedMenu( adminMenuGui, NULL ); + // } + + // if ( g_Game.GetUIManager().IsMenuOpen(7001) ) + // { + // g_Game.GetUIManager().CloseMenu(7001); + // g_Game.GetUIManager().ShowScriptedMenu( adminMenuMessage, NULL ); + // }else{ + // g_Game.GetUIManager().ShowScriptedMenu( adminMenuMessage, NULL ); + // } + } + break; + + + case (int)M_RPCs.M_Admin_Menu_OK: - Print("Admin Menu OK RPC"); + if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + { + //UIScriptedMenu adminMenuGui = NULL; + //adminMenuGui = new AdminMenuGui(); + UIScriptedMenu adminMenuGui = NULL; + adminMenuGui = new AdminMenuGui(); + if ( g_Game.GetUIManager().GetMenu() == NULL ) + { + g_Game.GetUIManager().ShowScriptedMenu( adminMenuGui, NULL ); + } + + + // if ( g_Game.GetUIManager().IsMenuOpen(7000) ) + // { + // if(!AMenuM.CanClose) + // { + // return; + // } + + + // g_Game.GetUIManager().HideScriptedMenu(adminMenuGui); + + //g_Game.GetUIManager().Back(); + + // g_Game.GetUIManager().CloseMenu(7000); + // g_Game.GetUIManager().CloseAll(); + // delete adminMenuGui; + //GetGame().GetUIManager().Back(); + + + // }else{ + // UIScriptedMenu adminMenuGui = NULL; + // adminMenuGui = new ref AdminMenuGui(); + // g_Game.GetUIManager().ShowScriptedMenu( adminMenuGui, NULL ); + // AMenuM.CanClose = true; + // } + } + break; + + case (int)M_RPCs.M_Admin_Menu_Teleport_Write_Pre: + if ( GetGame().IsServer()) + { + Print("Pos Pre"); + string PosNamet; + ctx.Read(PosNamet); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); + if ( Admin != NULL) + { + vector TLLPos = Admin.GetPosition(); + // ScriptRPC Addingpos = new ScriptRPC(); + // Addingpos.Write(PosNamet); + // Addingpos.Write(TLLPos); + // Print("Pos RPC"); + // Addingpos.Send(NULL, M_RPCs.M_Admin_Menu_Teleport_Write, false, NULL); + GetFileHandler().AddLocation(PosNamet, TLLPos) + } + } + break; + + case M_RPCs.M_Admin_Delete_Object: + Param1 ObjectParam; + ctx.Read( ObjectParam ); + Object ObJIs = ObjectParam.param1; if ( GetGame().IsServer() ) { + Admin = GetServerMission().IsAdminID( sender.GetName(), sender); + if ( Admin != NULL) + { + GetGame().ObjectDelete( ObJIs ); + status = "Object Deleted !"; + TL().status(sender, status); + } + } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - UIScriptedMenu adminMenuGui = NULL; - adminMenuGui = new AdminMenuGui(); - if ( g_Game.GetUIManager().GetMenu() == NULL ) - { - g_Game.GetUIManager().ShowScriptedMenu( adminMenuGui, NULL ); - } - } - break; case M_RPCs.M_Admin_Menu_Spawn_Ground: //read stuff @@ -182,12 +211,13 @@ class AdminMenu //extends UIScriptedMenu } if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID( sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID( sender.GetName(), sender); if ( Admin != NULL) { //EntityAI oObj = GetGame().CreateObject( GroundN_Item, Admin.GetPosition(), false, ai ); EntityAI oObj = EntityAI.Cast(GetGame().CreateObject( GroundN_Item, Admin.GetPosition(), false, ai )); + //obEditor.addObject( oObj ); if ( oObj.IsInherited( ItemBase ) ) { @@ -209,6 +239,8 @@ class AdminMenu //extends UIScriptedMenu oItem.SetQuantity(quantity); return; } + oObj.PlaceOnSurface(); + TL().status(sender, GroundN_Item + " Spawned"); } } @@ -224,7 +256,7 @@ class AdminMenu //extends UIScriptedMenu if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID( sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID( sender.GetName(), sender); if ( Admin != NULL) { @@ -261,12 +293,9 @@ class AdminMenu //extends UIScriptedMenu } if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID( sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID( sender.GetName(), sender); if ( Admin != NULL) { - - - EntityAI oInvItem = Admin.GetInventory().CreateInInventory( Inventory_Item ); oInvItem.SetHealth( oInvItem.GetMaxHealth() ); if ( oInvItem.IsInherited( ItemBase ) ) @@ -285,12 +314,7 @@ class AdminMenu //extends UIScriptedMenu } oItem.SetQuantity(quantity); return; - } - - - - - + } } } @@ -315,7 +339,7 @@ class AdminMenu //extends UIScriptedMenu } if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { EntityAI oCursorObj = EntityAI.Cast(GetGame().CreateObject( Cursor_Item, Cursor_Pos, false, ai )); @@ -338,10 +362,10 @@ class AdminMenu //extends UIScriptedMenu quantity = text.ToInt(); } oItem.SetQuantity(quantity); - oCursorObj.PlaceOnSurface(); return; } - + oCursorObj.PlaceOnSurface(); + TL().status(sender, Cursor_Item + " Spawned"); } } @@ -354,23 +378,29 @@ class AdminMenu //extends UIScriptedMenu if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { //AdminIdentity = Admin.GetIdentity(); - //AdminUID = AdminIdentity.GetPlainId(); + //AdminUID = AdminIdentity.GetId(); Print(AdminUID); - Admin.SetHealth( Admin.GetMaxHealth( "", "" ) ); - Admin.SetHealth( "","Blood", Admin.GetMaxHealth( "", "Blood" ) ); - Admin.GetStatEnergy().Add(250); - Admin.GetStatWater().Add(250); + Admin.GetMaxHealth( "", "" ); + Admin.SetHealth( "","Blood", Admin.GetMaxHealth( "", "Blood" ) ); + Admin.SetHealth( "GlobalHealth", "Health", Admin.GetMaxHealth( "GlobalHealth", "Health" ) ); + Admin.GetStatHeatComfort().Set(0); + Admin.GetStatTremor().Set(0); + Admin.GetStatWet().Set(0); + Admin.GetStatEnergy().Set(20000); + Admin.GetStatWater().Set(5000); + Admin.GetStatStomachEnergy().Set(20000); + Admin.GetStatStomachWater().Set(5000); + Admin.GetStatStomachVolume().Set(0); + Admin.GetStatDiet().Set(2500); + Admin.GetStatSpecialty().Set(1); Admin.SetBleedingBits(0); + TL().status(sender, sender.GetName() + " Healed"); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_Strip: @@ -380,7 +410,7 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { for ( int a = 0; a < players.Count(); ++a ) @@ -390,14 +420,11 @@ class AdminMenu //extends UIScriptedMenu if ( selectedIdentity.GetName() == PlayerName ) { selectedPlayer.RemoveAllItems(); + TL().status(sender, selectedIdentity.GetName() + " Striped"); } } } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_TpTo: @@ -405,67 +432,25 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { - - array playerstptp = new array; GetGame().GetPlayers( playerstptp ); - vector AdminPos; AdminPos = Admin.GetPosition(); - GetServerMission().Print("TPTO Target : " + selectedIdentity.GetName() + " PlayerName : " + PlayerName); for ( int it = 0; it < playerstptp.Count(); ++it ) { PlayerBase Targettpto = PlayerBase.Cast(playerstptp.Get(it)); selectedIdentity =playerstptp.Get(it).GetIdentity(); - GetServerMission().Print("TPTO Target : " + selectedIdentity.GetName() + " PlayerName : " + PlayerName + " Number :" + it.ToString()); if ( selectedIdentity.GetName() == PlayerName ) { - //PlayerBase Target = players.Get(i); - Targettpto.SetPosition( AdminPos ); + Targettpto.SetPosition( AdminPos ); + TL().status(sender, PlayerName + " Teleported"); } } - - - - - - - - - - - - // for ( int z = 0; z < players.Count(); ++z ) - // { - // if(Count >= m_Players.Count() ) - // { - // Count = 0; - // } - // selectedPlayer = PlayerBase.Cast(m_Players.Get(Count)); - // selectedIdentity = selectedPlayer.GetIdentity(); - // GetServerMission().Print("Current Player : " + selectedIdentity.GetName() + "TP Player name : " + PlayerName); - // if ( selectedIdentity.GetName() == PlayerName ) - // { - // selectedPlayer.SetPosition(Admin.GetPosition()); - - // Msgparam = new Param1( "You were teleported by the admin!" ); - // GetGame().RPCSingleParam(Admin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, selectedIdentity); - - // strMessage = "Player " + PlayerName + " was teleported to your location!"; - // Msgparam = new Param1( strMessage ); - // GetGame().RPCSingleParam(Admin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, AdminIdentity); - // } - // Count ++; - //} } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_TpMe: @@ -473,7 +458,7 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { for ( int zm = 0; zm < players.Count(); ++zm ) @@ -481,14 +466,11 @@ class AdminMenu //extends UIScriptedMenu if ( players.Get(zm).GetIdentity().GetName() == PlayerName ) { Admin.SetPosition(players.Get(zm).GetPosition()); + TL().status(sender, "Telepported to " + PlayerName); } } } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_TpMeToPos: @@ -506,7 +488,7 @@ class AdminMenu //extends UIScriptedMenu string Vec = "" + strs.Get(0).ToFloat() + "0.0" + strs.Get(2).ToFloat(); //vector ofixPlayerPos = Vector(x, 0.0, y) //vector ofixPlayerPos = Vector( x, z, y ); - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { //vector position = strs.Get(0) + " 0 " + strs.Get(2); @@ -516,40 +498,50 @@ class AdminMenu //extends UIScriptedMenu ofixPlayerPos[2] = strs.Get(2).ToFloat(); ofixPlayerPos = SnapToGround( ofixPlayerPos ); - Print("Teleport strs 0 : " + strs.Get(0) + " 1 : " + strs.Get(1) + " 2 : " + strs.Get(2)); - Print("Teleport Location ofix full : " + ofixPlayerPos); - Print("Teleport Location ToDestination Pos : " + TpDestination + strs.Get(0) + strs.Get(2)); - Admin.SetPosition(ofixPlayerPos); + Admin.SetPosition(ofixPlayerPos); + TL().status(sender, "Telepported to " + ofixPlayerPos.ToString(false) ); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + break; + + + case M_RPCs.M_Admin_Menu_TpMeToPosVec: + // Param2 teleParam + // Param1 teleParam + float X, Y; + ctx.Read(X); + ctx.Read(Y); + Print(" Param2 = " + X + " Param 0 = " + Y); + float atlZ = GetGame().SurfaceY(X, Y); + vector reqpos = Vector(X, atlZ, Y); + if ( GetGame().IsServer() ) { + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); + if ( Admin != NULL) + { + Admin.SetPosition(reqpos); + TL().status(sender, "Telepported to " + reqpos.ToString(false) ); + } } break; case M_RPCs.M_Admin_Menu_TpAllMe: if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { int tpCount = TeleportAllPlayersTo(Admin); - string msgc = "All " + tpCount.ToString() + " Players Teleported to my POS!"; - Msgparam = new Param1( msgc ); - GetGame().RPCSingleParam(Admin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, AdminIdentity); + string msgc = "All " + tpCount.ToString() + " Players Teleported here"; + TL().status(sender, msgc ); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_Spawn_Car: if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { Car MyNiva; @@ -560,20 +552,19 @@ class AdminMenu //extends UIScriptedMenu MyNiva = Car.Cast(GetGame().CreateObject( "OffroadHatchback", position22 + posModifier, false, true, true )); MyNiva.GetInventory().CreateAttachment("HatchbackHood"); MyNiva.GetInventory().CreateAttachment("HatchbackTrunk"); - MyNiva.GetInventory().CreateAttachment("HatchbackDoors_CoDriver"); MyNiva.GetInventory().CreateAttachment("HatchbackWheel"); MyNiva.GetInventory().CreateAttachment("HatchbackWheel"); MyNiva.GetInventory().CreateAttachment("HatchbackWheel"); MyNiva.GetInventory().CreateAttachment("HatchbackWheel"); MyNiva.GetInventory().CreateAttachment("SparkPlug"); - MyNiva.GetInventory().CreateAttachment("EngineBelt"); + MyNiva.GetInventory().CreateAttachment("CarRadiator"); MyNiva.GetInventory().CreateAttachment("CarBattery"); MyNiva.Fill( CarFluid.FUEL, MyNiva.GetFluidCapacity( CarFluid.FUEL ) ); MyNiva.Fill( CarFluid.OIL, MyNiva.GetFluidCapacity( CarFluid.OIL ) ); MyNiva.Fill( CarFluid.BRAKE, MyNiva.GetFluidCapacity( CarFluid.BRAKE ) ); MyNiva.Fill( CarFluid.COOLANT, MyNiva.GetFluidCapacity( CarFluid.COOLANT ) ); - + TL().status(sender, "Car spawned and filled" ); } } @@ -585,7 +576,7 @@ class AdminMenu //extends UIScriptedMenu case M_RPCs.M_Admin_Menu_Car_Refill: if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { ref array nearest_objects = new array; @@ -607,83 +598,44 @@ class AdminMenu //extends UIScriptedMenu toBeFilled.Fill( CarFluid.OIL, oilReq ); toBeFilled.Fill( CarFluid.COOLANT, coolantReq ); toBeFilled.Fill( CarFluid.BRAKE, brakeReq ); + TL().status(sender, "Car filled" ); } } } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_Day: if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { + //TODO CHANGEABLE GetGame().GetWorld().SetDate( 1988, 5, 23, 12, 0 ); + TL().status(sender, "Time Set to Day" ); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_Night: if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { GetGame().GetWorld().SetDate( 1988, 9, 23, 22, 0 ); + TL().status(sender, "Time Set to Night" ); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; - // case M_RPCs.M_Admin_Menu_TpToPos: - // ctx.Read( stringParam ); - // cData = stringParam.param1; - // if ( GetGame().IsServer() ) - // { - // Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); - // if ( Admin != NULL) - // { - // vector position3 = "0 0 0"; - // m_TPLocations.Find( cData, position3 ); - - // vector ofixPlayerPos; - // ofixPlayerPos[0] = position3[0]; - // ofixPlayerPos[2] = position3[2]; - - // ofixPlayerPos = SnapToGround( ofixPlayerPos ); - - // Admin.SetPosition(ofixPlayerPos); - - // strMessage = "Teleported To Location: " + cData; - // Msgparam = new Param1( strMessage ); - // GetGame().RPCSingleParam(Admin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, AdminIdentity); - - // } - // } - - // if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - // { - // } - // break; - case M_RPCs.M_Admin_Menu_Kill: ctx.Read( stringParam ); PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { for ( int ig = 0; ig < players.Count(); ++ig ) @@ -691,15 +643,12 @@ class AdminMenu //extends UIScriptedMenu PlayerBase Target = PlayerBase.Cast(players.Get(ig)); if ( Target.GetIdentity().GetName() == PlayerName ) { - Target.SetHealth(0); + Target.SetHealth(0); + TL().status(sender, PlayerName + "Killed" ); } } } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_KillAll: @@ -707,7 +656,7 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { for ( int ig1 = 0; ig1 < players.Count(); ++ig1 ) @@ -715,12 +664,9 @@ class AdminMenu //extends UIScriptedMenu PlayerBase Target1 = PlayerBase.Cast(players.Get(ig1)); Target1.SetHealth(0); } + TL().status(sender, "All Player Killed" ); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_HealAll: @@ -728,24 +674,30 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { for ( int ig2 = 0; ig2 < players.Count(); ++ig2 ) { PlayerBase Target2 = PlayerBase.Cast(players.Get(ig2)); - Target2.SetHealth( Admin.GetMaxHealth( "", "" ) ); - Target2.SetHealth( "","Blood", Admin.GetMaxHealth( "", "Blood" ) ); - Target2.GetStatEnergy().Add(250); - Target2.GetStatWater().Add(250); + Target2.GetMaxHealth( "", "" ); + Target2.SetHealth( "","Blood", Admin.GetMaxHealth( "", "Blood" ) ); + Target2.SetHealth( "GlobalHealth", "Health", Admin.GetMaxHealth( "GlobalHealth", "Health" ) ); + Target2.GetStatHeatComfort().Set(0); + Target2.GetStatTremor().Set(0); + Target2.GetStatWet().Set(0); + Target2.GetStatEnergy().Set(20000); + Target2.GetStatWater().Set(5000); + Target2.GetStatStomachEnergy().Set(20000); + Target2.GetStatStomachWater().Set(5000); + Target2.GetStatStomachVolume().Set(0); + Target2.GetStatDiet().Set(2500); + Target2.GetStatSpecialty().Set(1); Target2.SetBleedingBits(0); } + TL().status(sender, "All Player Healed" ); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_StripAll: @@ -753,7 +705,7 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { for ( int ig3 = 0; ig3 < players.Count(); ++ig3 ) @@ -761,6 +713,7 @@ class AdminMenu //extends UIScriptedMenu PlayerBase Target3 = PlayerBase.Cast(players.Get(ig3)); Target3.RemoveAllItems(); } + TL().status(sender, "All Player Striped" ); } } @@ -774,16 +727,13 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { - GetServerMission().RemoveStamina(PlayerName); + GetFileHandler().SetPermission("DisableStamina", PermissionType.DISALLOW, GetPlayerIdentityFromName(PlayerName).GetId()); + TL().status(sender, "Stamina reset Removed for " + PlayerName); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_Stamina_Dissable: @@ -791,16 +741,13 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { - GetServerMission().AddStamina(PlayerName); + GetFileHandler().SetPermission("DisableStamina", PermissionType.ALLOW, GetPlayerIdentityFromName(PlayerName).GetId()); + TL().status(sender, "Stamina reset Added for " + PlayerName); } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; case M_RPCs.M_Admin_Menu_Player_Stamina_Request: @@ -808,28 +755,46 @@ class AdminMenu //extends UIScriptedMenu PlayerName = stringParam.param1; if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { - if (GetServerMission().StaminaContains(PlayerName)) - { - ScriptRPC IsStamina = new ScriptRPC(); - IsStamina.Write(PlayerName); - IsStamina.Send(NULL, M_RPCs.M_Admin_Menu_Player_Stamina_ok, false, AdminIdentity); - }else - { - ScriptRPC IsStamina2 = new ScriptRPC(); - IsStamina2.Write("NULL"); - IsStamina2.Send(NULL, M_RPCs.M_Admin_Menu_Player_Stamina_ok, false, AdminIdentity); - } + if(GetFileHandler().HasPermission("DisableStamina", GetPlayerIdentityFromName(PlayerName)) + { + ScriptRPC IsStamina = new ScriptRPC(); + IsStamina.Write(PlayerName); + IsStamina.Send(NULL, M_RPCs.M_Admin_Menu_Player_Stamina_ok, false, AdminIdentity); + }else + { + ScriptRPC IsStamina2 = new ScriptRPC(); + IsStamina2.Write("NULL"); + IsStamina2.Send(NULL, M_RPCs.M_Admin_Menu_Player_Stamina_ok, false, AdminIdentity); + } } } - - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - } break; + case M_RPCs.M_Admin_Menu_Teleport_RequestData: + if ( GetGame().IsServer() ) + { + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); + if ( Admin != NULL) + { + GetFileHandler().LoadTeleport(); + ref array TpName = new ref array< string >; + ref array TpPos = new ref array< vector >; + for ( i = 0; i < GetFileHandler().RootTeleport.Children.Count(); i++ ) + { + TpName.Insert(GetFileHandler().RootTeleport.Children[i].LocationName) + TpPos.Insert(GetFileHandler().RootTeleport.Children[i].LocationPos) + } + ScriptRPC Adding = new ScriptRPC(); + Adding.Write(TpName); + Adding.Write(TpPos); + Adding.Send(NULL, M_RPCs.M_Admin_Menu_Teleport_ReciveData, false, Admin.GetIdentity()); + } + } + break; + case M_RPCs.M_Admin_Menu_PM: string MSG; string MSGName;//Vector Postition @@ -837,7 +802,7 @@ class AdminMenu //extends UIScriptedMenu ctx.Read(MSGName); if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { for ( int z1 = 0; z1 < players.Count(); ++z1 ) @@ -847,7 +812,8 @@ class AdminMenu //extends UIScriptedMenu if ( selectedIdentity.GetName() == MSGName ) { Msgparam = new Param1( MSG ); - GetGame().RPCSingleParam(Admin, ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, AdminIdentity); + GetGame().RPCSingleParam(NULL , ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, selectedIdentity); + TL().status(sender, "Message Sent to " + selectedIdentity.GetName()); } } } @@ -865,7 +831,7 @@ class AdminMenu //extends UIScriptedMenu if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { GetServerMission().SendPosTOAdmins(); @@ -881,26 +847,22 @@ class AdminMenu //extends UIScriptedMenu if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); if ( Admin != NULL) { - GetServerMission().SendPlayerListToAdmins(); + array playerss = new array; + array allplayers = new array; + GetGame().GetPlayers( playerss ); + for ( i = 0; i < playerss.Count(); ++i) + { + PlayerBase currentPlayer = PlayerBase.Cast(playerss.Get(i)); + string playername = currentPlayer.GetIdentity().GetName(); + allplayers.Insert(playername) } - } - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { + ScriptRPC Plist = new ScriptRPC(); + Plist.Write(allplayers); + Plist.Send(NULL, M_RPCs.M_Admin_Menu_Player_List, true, sender); - } - break; - - case M_RPCs.M_Admin_Menu_Teleport_List_Request: - if ( GetGame().IsServer() ) - { - - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); - if ( Admin != NULL) - { - adminMenuManager.LoadTeleportLocations(AdminIdentity);; } } if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) @@ -910,36 +872,46 @@ class AdminMenu //extends UIScriptedMenu break; case M_RPCs.M_Admin_Menu_Player_Health_Request: - + Param1 stringParamss; + ctx.Read( stringParamss ); + string RecPlayer = stringParamss.param1; + Print("Health Request"); PlayerBase HealthPlayer; - ctx.Read(HealthPlayer); if ( GetGame().IsServer() ) { - Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); - if ( Admin != NULL) - { - DebugMonitorValues values = HealthPlayer.GetDebugMonitorValues(); - float Value1; - Value1 = HealthPlayer.GetHealth("", "Health"); - string health = string.Format(" %1", Value1.ToString()); - Print("Name : " + HealthPlayer.GetIdentity().GetName() + "Health :" + health); - - float Value2; - Value2 = HealthPlayer.GetHealth("", "Blood"); - string blood = string.Format(" %1", Value2.ToString()); - Print("Name : " + HealthPlayer.GetIdentity().GetName() + "blood :" + blood); + array playerssh = new array; + + GetGame().GetPlayers( playerssh ); + for ( i = 0; i < playerssh.Count(); ++i) + { + HealthPlayer = PlayerBase.Cast(playerssh.Get(i)); + string playername1 = HealthPlayer.GetIdentity().GetName(); + Print("Curretn = " + playername1 + "Looking for " + RecPlayer); + if(playername1 == RecPlayer) + { + ref FPPlayer HPlayer = NULL; + ref PlayerDataN HData = new ref PlayerDataN; + HPlayer = GetFileHandler().GetPlayerByIdentity(HealthPlayer.GetIdentity()); + HData = HPlayer.Data; + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); + if ( Admin != NULL) + { + DebugMonitorValues values = HealthPlayer.GetDebugMonitorValues(); + string health, blood, HPos; + health = HData.FHealth.ToString(); + blood = HData.FBlood.ToString(); + HPos = HData.VPosition.ToString(); + Print("Healt Player Found " + health); + ScriptRPC PPos = new ScriptRPC(); + PPos.Write(health); + PPos.Write(blood); + PPos.Write(HPos); + PPos.Send(NULL, M_RPCs.M_Admin_Menu_Player_Health, false, AdminIdentity); + } + } + - vector Value; - Value = HealthPlayer.GetPosition(); - string positionP = string.Format(" %1 %2 %3", Value[0].ToString(), Value[1].ToString(), Value[2].ToString()); - Print("Name : " + HealthPlayer.GetIdentity().GetName() + "positionP :" + positionP); - - ScriptRPC PPos = new ScriptRPC(); - PPos.Write(health); - PPos.Write(blood); - PPos.Write(positionP); - PPos.Send(NULL, M_RPCs.M_Admin_Menu_Player_Health, false, AdminIdentity); } } if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) @@ -952,7 +924,46 @@ class AdminMenu //extends UIScriptedMenu } } - + + ref PlayerBase GetPlayerBaseFromName(string name) + { + array players = new array; + GetGame().GetPlayers( players ); + PlayerBase Target; + for ( int ig = 0; ig < players.Count(); ++ig ) + { + Target = PlayerBase.Cast(players.Get(ig)); + if ( Target.GetIdentity().GetName() == name ) + { + return Target; + } + } + return Target; + } + + ref PlayerIdentity GetPlayerIdentityFromName(string name) + { + array players = new array; + GetGame().GetPlayers( players ); + PlayerBase Target; + PlayerIdentity TargetIdent; + for ( int ig = 0; ig < players.Count(); ++ig ) + { + Target = PlayerBase.Cast(players.Get(ig)); + TargetIdent = Target.GetIdentity(); + if ( TargetIdent.GetName() == name ) + { + return TargetIdent; + } + } + return TargetIdent; + } + + void status(PlayerIdentity ident, string msg) + { + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_MessageStatus, new Param1( msg ), false, ident ); + } + void SendRPC() { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu, new Param1( GetCursorPos() ), false, AdminIdentity ); @@ -1083,9 +1094,14 @@ class AdminMenu //extends UIScriptedMenu - - - - - +} +ref AdminMenu Tomato_AdminMenuM; +ref AdminMenu GetAdminM() +{ + if( !Tomato_AdminMenuM ) + { + Tomato_AdminMenuM = new ref AdminMenu(); + } + + return Tomato_AdminMenuM; } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/AdminMenuManager.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/AdminMenuManager.c index c6b1253..defefc9 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/AdminMenuManager.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/AdminMenuManager.c @@ -22,12 +22,19 @@ class AdminMenuManager static bool Config_Teleport = false; static bool Config_Cam = false; + static bool Spectate = false; + static string SpectatePlayer; + static bool Config_Map_Teleport = false; + static bool Config_Map_Horde = false; + static bool CanClose = true; + //ref AdminMenuMessage m_adMenuMessage; + static string Version = "Version : 1.20"; static ref map m_PlayerLocations; static ref map m_TeleportLocations; protected string m_TeleportLocationsPath = "$CurrentDir:\\DayZ-Sa-Tomato\\Config\\List\\TeleportLocation.txt"; void ~AdminMenuManager() { - + // GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).Remove( this.MessageClose ); } void AdminMenuManager() @@ -35,6 +42,7 @@ class AdminMenuManager m_PlayerLocations = new map; m_TeleportLocations = new map; //LoadTeleportLocations(); + // GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( this.MessageClose, 1000, true ); } void Teleport() @@ -45,18 +53,76 @@ class AdminMenuManager } } - void CamTeleport( bool isSpectating, vector toPos ) + void Map_Teleport() + { + if (Config_Teleport) + { + GetGame().RPCSingleParam( NULL, M_RPCs.M_TELEPORT, new Param1( GetCursorPos() ), false, NULL ); + } + } + + bool IsSpectate() + { + return Spectate; + } + + void SetSpectate() + { + Spectate = !Spectate; + } + + void CamSpectate( bool isSpectating, string PlayerName, bool tp, vector posi, bool enable = true) + { + if(enable) + { + //TL().player("enable"); + SpectatePlayer = PlayerName; + GetGame().RPCSingleParam( NULL, M_RPCs.M_SET_CAM_Spectate, new Param4< bool, string, bool, vector >( Spectate, SpectatePlayer, tp, posi ), false, NULL ); + }else + { + //TL().player("not Enable"); + GetGame().RPCSingleParam( NULL, M_RPCs.M_SET_CAM_Spectate, new Param4< bool, string, bool, vector >( Spectate, SpectatePlayer, tp, posi ), false, NULL ); + SpectatePlayer = ""; + } + + } + + void CamTeleport( bool isSpectating, vector toPos, bool tp = true ) { if (Config_Cam) { - Print("Send Cam RPC"); - GetGame().RPCSingleParam( NULL, M_RPCs.M_SET_CAM, new Param2< bool, vector >( isSpectating, toPos ), false, NULL ); + GetGame().RPCSingleParam( NULL, M_RPCs.M_SET_CAM, new Param3< bool, vector, bool >( isSpectating, toPos, tp ), false, NULL ); } } void MenuOpen() { - GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu, new Param1( GetCursorPos() ), false, NULL ); + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu, new Param1( "" ), false, NULL ); + } + + void MessageClose() + { + GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", "Should Close", "")); + g_Game.GetUIManager().CloseMenu(7001); + } + + void MessageMenu(string MenuMessage) + { + UIScriptedMenu adminMenuMessage = NULL; + adminMenuMessage = new AdminMenuMessage(MenuMessage); + + if ( g_Game.GetUIManager().IsMenuOpen(7001) ) + { + adminMenuMessage.Close(); + g_Game.GetUIManager().ShowScriptedMenu( adminMenuMessage, NULL ); + }else{ + g_Game.GetUIManager().ShowScriptedMenu( adminMenuMessage, NULL ); + } + } + + void MessageOpen(PlayerIdentity ident, string msg) + { + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_MessageBox, new Param1( msg ), false, ident ); } void SendTeleportList(PlayerIdentity admin) @@ -72,24 +138,6 @@ class AdminMenuManager TList.Send(NULL, M_RPCs.M_Admin_Menu_Teleport_List, false, admin); - // for (int i = 0; i < m_TeleportLocations.Count(); ++i) - // { - - - // TStringArray strs = new TStringArray; - // save = m_TeleportLocations.GetElement(i); - // save.Split(a, strs ); - // v = strs.Get(1).ToVector(); - // string Lname = strs.Get(0); - // Print("SendTeleportList Number : " + i + " Name : " + Lname + "Pos : " + strs.Get(1).ToVector()); - - - // ScriptRPC TList = new ScriptRPC(); - // TList.Write(Lname); - // TList.Write(v); - // TList.Send(NULL, M_RPCs.M_Admin_Menu_Teleport_List, false, admin); - - //} } void LoadTeleportLocations(PlayerIdentity admin) @@ -103,19 +151,13 @@ class AdminMenuManager string line_content = ""; while ( FGets(TpList,line_content) > 0 ) { - TStringArray strs = new TStringArray; - //string.Split(line_content, a, strs ); - //line_content.Split(";", strs) - //vector v = strs.Get(1).ToVector(); m_TeleportLocations.Insert(i,line_content); //int Name, posvector - Print("Adding Number : " + i + " line : " + line_content + " To the Teleport List!"); i++; } CloseFile(TpList); SendTeleportList(admin); } - Print("TpList = NULL"); } @@ -127,4 +169,16 @@ class AdminMenuManager } +} + +ref AdminMenuManager Tomato_AdminMenuManager; + +ref AdminMenuManager GetAdminMenuManager() +{ + if( !Tomato_AdminMenuManager ) + { + Tomato_AdminMenuManager = new ref AdminMenuManager(); + } + + return Tomato_AdminMenuManager; } \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/DevCam.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/DevCam.c index 5af5b9b..9b194ee 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/DevCam.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/DevCam.c @@ -37,15 +37,21 @@ class DevCam ref PlayerBase player = PlayerBase.Cast(GetServerMission().GetPlayerFromIdentity( sender )); - Param2< bool, vector > camParams; + Param3< bool, vector, bool > camParams; ctx.Read( camParams ); bool spectating = camParams.param1; vector pos = camParams.param2; - if ( GetServerMission().IsAdmin( sender.GetName(), sender.GetPlainId() ) ) + if ( GetFileHandler().HasPermission("Admin", sender) ) { if ( spectating ) { + if(!camParams.param3) + { + SetFreezePlayer( player, false ); + GetGame().SelectPlayer( sender, player ); + return; + } player.SetPosition( pos ); SetFreezePlayer( player, false ); GetGame().SelectPlayer( sender, player ); @@ -59,7 +65,66 @@ class DevCam } if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) { // test if setting camera works on client side. instead of server side ^ - GetPlayer().MessageStatus("Toggle Free cam"); + } + + } + + if ( rpc_type == M_RPCs.M_SET_CAM_Spectate ) + { + Print("rpc spec"); + if ( GetGame().IsServer() ) + { + array players = new array; + GetGame().GetPlayers( players ); + PlayerIdentity selectedIdentity; + PlayerBase selectedPlayer; + player = PlayerBase.Cast(GetServerMission().GetPlayerFromIdentity( sender )); + + Param4< bool, string, bool, vector > specParams; + ctx.Read( specParams ); + + bool spectatingnew = specParams.param1; + + if ( GetFileHandler().HasPermission("Admin", sender) ) + { + for ( int a = 0; a < players.Count(); ++a ) + { + selectedPlayer = PlayerBase.Cast(players.Get(a)); + selectedIdentity = NULL; + if ( selectedPlayer.GetIdentity().GetName() == specParams.param2 ) + { + selectedIdentity = selectedPlayer.GetIdentity(); + pos = GetServerMission().GetPlayerFromIdentity( selectedIdentity ).GetPosition() + break; + } + } + + if(selectedIdentity == NULL) {return;} + + if ( spectatingnew ) + { + Print("Stop spec"); + if(!specParams.param3) + { + SetFreezePlayer( player, false ); + GetGame().SelectPlayer( sender, player ); + return; + } + + player.SetPosition( specParams.param4 ); + SetFreezePlayer( player, false ); + GetGame().SelectPlayer( sender, player ); + } + else + { + Print("Start Spec " + selectedIdentity.GetName()); + SetFreezePlayer( player, true ); + GetGame().SelectSpectator( sender, "DayZSpectator", pos ); + } + } + } + if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + { // test if setting camera works on client side. instead of server side ^ } } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/DevTeleport.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/DevTeleport.c index ddbe2b8..2a0223d 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/DevTeleport.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/DevTeleport.c @@ -42,7 +42,8 @@ class DevTeleport ref PlayerBase player = PlayerBase.Cast(GetServerMission().GetPlayerFromIdentity( sender )); // permission check - server mission file // if has permissions send message back to client - if ( GetServerMission().IsAdmin( sender.GetName(), sender.GetPlainId()) ) + if (GetFileHandler().HasPermission("Admin", sender) ) + { player.SetPosition( positionToTeleport ); //set player position on server side @@ -53,7 +54,6 @@ class DevTeleport if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) { //GetPlayer().SetPosition( positionToTeleport ); //client side - GetPlayer().MessageStatus( "Teleported "); } } } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuCommands.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuCommands.c index 75a133a..4a3a797 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuCommands.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuCommands.c @@ -35,6 +35,7 @@ class AdminMenuGuiCommands extends ScriptedWidgetEventHandler protected ButtonWidget m_Command_SpCar; protected ButtonWidget m_Command_Cam; protected ButtonWidget m_Command_CamTp; + protected ButtonWidget m_Command_DelObj; protected ButtonWidget m_Command_Test; protected ref map m_TestList; protected string m_TestListPath = "$CurrentDir:\\DayZ-SA-Tomato\\Config\\"; @@ -58,6 +59,7 @@ class AdminMenuGuiCommands extends ScriptedWidgetEventHandler m_Command_Refill = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Command_Refill" ) ); m_Command_Cam = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Command_Cam" ) ); m_Command_CamTp = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Command_CamTp" ) ); + m_Command_DelObj = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Command_DelObj" ) ); m_Command_Test = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Command_Test" ) ); @@ -77,21 +79,6 @@ class AdminMenuGuiCommands extends ScriptedWidgetEventHandler m_Config_Teleport.SetChecked(false); } - - //-----Add Admins from txt----- - FileHandle AdminUIDSFile = OpenFile(m_TestListPath + "Test.txt",FileMode.READ); - if (AdminUIDSFile != 0) - { - m_TestList = new map; //UID, name - string line_content = ""; - while ( FGets(AdminUIDSFile,line_content) > 0 ) - { - m_TestList.Insert(line_content,"null"); //UID , NAME - } - CloseFile(AdminUIDSFile); - } - - } bool Click(Widget w, int x, int y, int button) @@ -102,7 +89,6 @@ class AdminMenuGuiCommands extends ScriptedWidgetEventHandler if( ( w == m_Command_HealButton ) ) { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Heal, new Param1(""), false, NULL ); - Message("1 Up"); return true; } @@ -110,28 +96,30 @@ class AdminMenuGuiCommands extends ScriptedWidgetEventHandler if( ( w == m_Command_SpCar ) ) { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Spawn_Car, new Param1(""), false, NULL ); - Message("Going fast"); return true; } if( ( w == m_Command_Day ) ) { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Day, new Param1(""), false, NULL ); - Message("DayTime"); return true; } if( ( w == m_Command_Night ) ) { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Night, new Param1(""), false, NULL ); - Message("NightTime"); return true; } if( ( w == m_Command_Refill ) ) { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Car_Refill, new Param1(""), false, NULL ); - Message("Gas Station"); + return true; + } + + if( ( w == m_Command_DelObj ) ) + { + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Delete_Object, new Param1(GetCursorObject( 50.0, GetGame().GetPlayer(), 0.01 )), false, NULL ); return true; } @@ -139,8 +127,7 @@ class AdminMenuGuiCommands extends ScriptedWidgetEventHandler { string msg; msg = "TestLog"; - GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Log_Info, new Param1( msg ), false, NULL ); - Message("Send Log RPC msg = " + msg); + //GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_TestConf, new Param1( msg ), false, NULL ); return true; } return true; @@ -148,6 +135,21 @@ class AdminMenuGuiCommands extends ScriptedWidgetEventHandler return false; } + static Object GetCursorObject( float distance = 100.0, Object ignore = NULL, float radius = 0.5, Object with = NULL ) + { + vector rayStart = GetGame().GetCurrentCameraPosition(); + vector rayEnd = rayStart + GetGame().GetCurrentCameraDirection() * distance; + + auto objs = GetObjectsAt( rayStart, rayEnd, ignore, radius, with ); + + if( objs.Count() > 0 ) + { + return objs[ 0 ]; + } + + return NULL; + } + void Set_Teleport() { if (AMenuM.Config_Teleport) diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuGui.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuGui.c index 2c80dc6..9cf4814 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuGui.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuGui.c @@ -25,22 +25,32 @@ class AdminMenuGui extends UIScriptedMenu protected ref AdminMenuGuiPlayer m_PlayerTab; protected ref AdminMenuGuiMap m_MapTab; protected ref AdminMenuGuiTeleport m_TeleportTab; - protected ref AdminMenuGuiTeleport m_ConfigTab; + protected ref AdminMenuGuiAbout m_AboutTab; protected ref AdminMenuGuiTeleport m_todo; protected ref AdminMenuGuiTeleport m_todo2; - + ref AdminMenuManager AMenuM; protected ref map m_TestListS; protected string m_TestListPath = "$CurrentDir:\\DayZ-SA-Tomato\\"; - + ref array Locations; protected ButtonWidget m_Back; + protected TextWidget m_txt_Main_Ver; + static MultilineTextWidget m_txt_Main_Status; void AdminMenuGui() { - + ref array Locations = new ref array; + SetID(7000); + GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); } + override void Update(float tome) + { + m_MapTab.Update(); + } + override bool OnItemSelected( Widget w, int x, int y, int row, int column, int oldRow, int oldColumn ) { + bool okstap; okstap = false; if ( w == m_SpawnTab.m_classList ) { @@ -54,13 +64,14 @@ class AdminMenuGui extends UIScriptedMenu { GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); } + override bool OnChange( Widget w, int x, int y, bool finished ) { if ( w == m_PlayerTab.m_PlayerList ) - { - m_PlayerTab.PlayerSelect(); - return true; - } + { + m_PlayerTab.PlayerSelect(); + return true; + } if ( w == m_SpawnTab.m_Spawn_SearchBox ) { @@ -74,26 +85,55 @@ class AdminMenuGui extends UIScriptedMenu return true; } + if ( w == m_MapTab.m_Config_Map_Teleport ) + { + m_MapTab.Set_Map_Teleport(); + return true; + } + + if ( w == m_MapTab.m_Config_Map_Horde ) + { + m_MapTab.Set_Map_Horde(); + return true; + } + if ( w == m_CommandTab.m_Config_Cam ) { m_CommandTab.Set_Cam(); return true; } - if ( w == m_PlayerTab.m_Cb_Player_Stamina ) - { - m_PlayerTab.Set_Stamina(); - return true; - } + if ( w == m_PlayerTab.m_Cb_Player_Stamina ) + { + m_PlayerTab.Set_Stamina(); + return true; + } return false; } - void ItemPrevCall(EntityAI item) + + + void ItemPrevCall(EntityAI item) + { + m_SpawnTab.OnItemSelect2(item); + } + + void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) { - m_SpawnTab.OnItemSelect2(item); + switch(rpc_type) + { + + case (int)M_RPCs.M_Admin_Menu_MessageStatus: + Param1 MenuMessagep; + ctx.Read( MenuMessagep ); + string MenuMessage = MenuMessagep.param1; + if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + { + SetStatus(MenuMessage); + } + break; + } } - - @@ -105,50 +145,145 @@ class AdminMenuGui extends UIScriptedMenu - m_CommandTab = new AdminMenuGuiCommands( layoutRoot.FindAnyWidget( "Tab_0" ), this ); - m_SpawnTab = new AdminMenuGuiSpawn( layoutRoot.FindAnyWidget( "Tab_1" ), this ); - m_PlayerTab = new AdminMenuGuiPlayer( layoutRoot.FindAnyWidget( "Tab_2" ), this ); - m_MapTab = new AdminMenuGuiMap( layoutRoot.FindAnyWidget( "Tab_3" ), this ); - m_TeleportTab = new AdminMenuGuiTeleport( layoutRoot.FindAnyWidget( "Tab_4" ), this ); - m_ConfigTab = new AdminMenuGuiTeleport( layoutRoot.FindAnyWidget( "Tab_5" ), this ); - m_todo = new AdminMenuGuiTeleport( layoutRoot.FindAnyWidget( "Tab_5" ), this ); - m_todo2 = new AdminMenuGuiTeleport( layoutRoot.FindAnyWidget( "Tab_5" ), this ); + m_CommandTab = new AdminMenuGuiCommands( layoutRoot.FindAnyWidget( "Tab_0" ), this ); + m_SpawnTab = new AdminMenuGuiSpawn( layoutRoot.FindAnyWidget( "Tab_1" ), this ); + m_PlayerTab = new AdminMenuGuiPlayer( layoutRoot.FindAnyWidget( "Tab_2" ), this ); + m_MapTab = new AdminMenuGuiMap( layoutRoot.FindAnyWidget( "Tab_3" ), this ); + m_TeleportTab = new AdminMenuGuiTeleport( layoutRoot.FindAnyWidget( "Tab_4" ), this ); + m_AboutTab = new AdminMenuGuiAbout( layoutRoot.FindAnyWidget( "Tab_5" ), this ); + + //m_todo = new AdminMenuGuiTeleport( layoutRoot.FindAnyWidget( "Tab_5" ), this ); + //m_todo2 = new AdminMenuGuiTeleport( layoutRoot.FindAnyWidget( "Tab_5" ), this ); m_Back = ButtonWidget.Cast( layoutRoot.FindAnyWidget( "back" ) ); - + m_txt_Main_Ver = TextWidget.Cast( layoutRoot.FindAnyWidget( "txt_Main_Ver" ) ); + m_txt_Main_Status = TextWidget.Cast( layoutRoot.FindAnyWidget( "txt_Main_Status" ) ); + m_txt_Main_Ver.SetText(GetAdminMenuManager().Version); SetFocus( layoutRoot ); m_Tabber.m_OnTabSwitch.Insert( OnTabSwitch ); - - /* - //-----Add Admins from txt----- - FileHandle AdminUIDSFile = OpenFile(m_AdminListPath + "Admins.txt",FileMode.READ); - if (AdminUIDSFile != 0) - { - m_AdminList = new map; //UID, name - string line_content = ""; - while ( FGets(AdminUIDSFile,line_content) > 0 ) - { - m_AdminList.Insert(line_content,"null"); //UID , NAME - Print("Adding Admin: "+ line_content + " To the Admin List!"); - } - CloseFile(AdminUIDSFile); - } - - */ return layoutRoot; } void ~AdminMenuGui() { - + delete m_SpawnTab; + delete m_AboutTab; + delete m_MapTab; + delete m_CommandTab; + delete m_TeleportTab; } + void SetStatus(string txt) + { + // if(m_txt_Main_Status == NULL) + // { + m_txt_Main_Status = TextWidget.Cast( layoutRoot.FindAnyWidget( "txt_Main_Status" ) ); + // } + + m_txt_Main_Status.SetText(txt); + GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( this.SetStatusNull, 1500, false ); + } + + void SetStatusNull() + { + //m_txt_Main_Status = TextWidget.Cast( layoutRoot.FindAnyWidget( "txt_Main_Status" ) ); + m_txt_Main_Status.SetText(""); + } + + override bool OnMouseLeave(Widget w, Widget enterW, int x, int y) + { + super.OnMouseLeave(w, enterW, x, y); + bool ret; + if ( w == m_MapTab.m_Map_Map ) + { + ret = m_MapTab.OnMouseLeave(w, x, y); + } + + //MapTab HordeCount + if ( w == m_MapTab.m_editbox_Map_HordeCount ) + { + m_MapTab.MouseLeave(w, enterW, x, y); + ret = true; + } + + //PlayerTab + if ( w.GetName().Contains("_Player_") ) + { + m_PlayerTab.MouseLeave(w, enterW, x, y); + ret = true; + } + + //SpawnTab + if ( w.GetName().Contains("_Spawn_") ) + { + m_SpawnTab.MouseLeave(w, enterW, x, y); + ret = true; + } + + //TeleportTab + if ( w.GetName().Contains("_Teleport_") ) + { + m_TeleportTab.MouseLeave(w, enterW, x, y); + ret = true; + } + + + return ret; + } + + override bool OnMouseEnter( Widget w, int x, int y ) + { + + bool ret; + if ( w == m_MapTab.m_Map_Map ) + { + ret = m_MapTab.OnMouseEnter(w, x, y); + } + + if ( w == m_MapTab.m_helper_Map_MouseLeave ) + { + ret = m_MapTab.OnMouseEnter(w, x, y); + } + + //MapTab HordeCount + if ( w == m_MapTab.m_editbox_Map_HordeCount ) + { + m_MapTab.MouseEnter(w, x, y); + ret = true; + } + + //PlayerTab + if ( w.GetName().Contains("_Player_") ) + { + m_PlayerTab.MouseEnter(w, x, y); + ret = true; + } + + //SpawnTab + if ( w.GetName().Contains("_Spawn_") ) + { + m_SpawnTab.MouseEnter(w, x, y); + ret = true; + } + + //TeleportTab + if ( w.GetName().Contains("_Teleport_") ) + { + m_TeleportTab.MouseEnter(w, x, y); + ret = true; + } + + return ret; + } + + + override bool OnClick( Widget w, int x, int y, int button ) { - //SpawnTab + ////SpawnTab bool ok = false; if ( w.GetName().Contains("_spawn_") ) { @@ -157,11 +292,11 @@ class AdminMenuGui extends UIScriptedMenu } //TeleportTab - if ( w.GetName().Contains("_Teleport_") ) - { - ok = m_TeleportTab.Click(w, x, y, button); - return ok; - } + if ( w.GetName().Contains("_Teleport_") ) + { + ok = m_TeleportTab.Click(w, x, y, button); + return ok; + } //CommandTab if ( w.GetName().Contains("_Command_") ) @@ -171,21 +306,21 @@ class AdminMenuGui extends UIScriptedMenu } //PlayerTab - if ( w.GetName().Contains("_Player_") ) - { - ok = m_PlayerTab.Click(w, x, y, button); - return ok; - } + if ( w.GetName().Contains("_Player_") ) + { + ok = m_PlayerTab.Click(w, x, y, button); + return ok; + } //Main Widget - if( button == MouseState.LEFT ) - { - if( w == m_Back ) - { - Back(); - return true; - } - } + if( button == MouseState.LEFT ) + { + if( w == m_Back ) + { + Back(); + return true; + } + } return false; } @@ -210,7 +345,7 @@ class AdminMenuGui extends UIScriptedMenu } case 3: { - m_TeleportTab.Focus(); + m_TeleportTab.Focus(); break; } case 4: @@ -220,7 +355,12 @@ class AdminMenuGui extends UIScriptedMenu } case 5: { - m_ConfigTab.Focus(); + m_AboutTab.Focus(); + break; + } + case 6: + { + //m_AboutTab.Focus(); break; } } @@ -234,58 +374,6 @@ class AdminMenuGui extends UIScriptedMenu } - - - - override bool OnMouseEnter( Widget w, int x, int y ) - { - if( w && IsFocusable( w ) ) - { - ColorRed( w ); - return true; - } - return false; - } - - override bool OnMouseLeave( Widget w, Widget enterW, int x, int y ) - { - if( w && IsFocusable( w ) ) - { - ColorWhite( w, enterW ); - return true; - } - return false; - } - - override bool OnFocus( Widget w, int x, int y ) - { - if( w && IsFocusable( w ) ) - { - ColorRed( w ); - return true; - } - return false; - } - - override bool OnFocusLost( Widget w, int x, int y ) - { - if( w && IsFocusable( w ) ) - { - ColorWhite( w, null ); - return true; - } - return false; - } - - bool IsFocusable( Widget w ) - { - if( w ) - { - return ( w == m_Back ); - } - return false; - } - override void OnShow() { @@ -301,28 +389,16 @@ class AdminMenuGui extends UIScriptedMenu GetGame().GetInput().ResetGameFocus( ); } - //Coloring functions (Until WidgetStyles are useful) - void ColorRed( Widget w ) - { - SetFocus( w ); - - ButtonWidget button = ButtonWidget.Cast( w ); - if( button ) - { - button.SetTextColor( ARGB( 255, 200, 0, 0 ) ); - } - } - void ColorWhite( Widget w, Widget enterW ) - { - #ifdef PLATFORM_WINDOWS - SetFocus( null ); - #endif - - ButtonWidget button = ButtonWidget.Cast( w ); - if( button ) - { - button.SetTextColor( ARGB( 255, 255, 255, 255 ) ); - } - } } +ref AdminMenuGui Tomato_AdminMenu; + +ref AdminMenuGui GetAdminMenu() +{ + if( !Tomato_AdminMenu ) + { + Tomato_AdminMenu = new ref AdminMenuGui(); + } + + return Tomato_AdminMenu; +} \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuMap.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuMap.c index 1d144e6..f56c5a7 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuMap.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuMap.c @@ -21,35 +21,150 @@ class AdminMenuGuiMap extends ScriptedWidgetEventHandler { protected Widget m_Root; -protected MapWidget m_Map_Map; - + MapWidget m_Map_Map; + ItemPreviewWidget m_helper_Map_MouseLeave; + //ref AdminMenuManager AMenuM; + ref HordeModule m_HordeModule; protected AdminMenuGui m_Menu; - + protected bool TpOK = true; + EditBoxWidget m_editbox_Map_HordeCount; + protected bool HordeOK = true; protected ref map> m_TextMap; + protected TextWidget m_Text_Map_Location; + protected bool PointerMap = false; + CheckBoxWidget m_Config_Map_Teleport; + CheckBoxWidget m_Config_Map_Horde; void AdminMenuGuiMap( Widget parent, AdminMenuGui menu ) { + GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); + m_HordeModule = new ref HordeModule(); m_Root = GetGame().GetWorkspace().CreateWidgets( "com\\DayZ-SA-Tomato\\scripts\\5_Mission\\core\\modules\\GUI\\Layouts\\Admin_Map.layout", parent ); m_Menu = menu; - m_Map_Map = MapWidget.Cast( m_Root.FindAnyWidget( "Map" ) ); + m_Map_Map = MapWidget.Cast( m_Root.FindAnyWidget( "Map_Map_Main" ) ); + m_helper_Map_MouseLeave = ItemPreviewWidget.Cast( m_Root.FindAnyWidget( "helper_Map_MouseLeave" ) ); + m_editbox_Map_HordeCount = EditBoxWidget.Cast( m_Root.FindAnyWidget( "editbox_Map_HordeCount" ) ); + m_Text_Map_Location = TextWidget.Cast( m_Root.FindAnyWidget( "Text_Map_Location" ) ); + m_Config_Map_Teleport = CheckBoxWidget.Cast( m_Root.FindAnyWidget( "Config_Map_Teleport" ) ); + m_Config_Map_Horde = CheckBoxWidget.Cast( m_Root.FindAnyWidget( "Config_Map_Horde" ) ); GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Map_Player_Request, new Param1(""), false, NULL ); - + if (GetAdminMenuManager().Config_Map_Teleport) { - //GetMarkers(); - /* - m_Map_Map.AddUserMark("2681 4.7 1751", "Lalal", ARGB(255,255,0,0), "\\dz\\gear\\navigation\\data\\map_tree_ca.paa"); - m_Map_Map.AddUserMark("2683 4.7 1851", "Lala2", ARGB(255,0,255,0), "\\dz\\gear\\navigation\\data\\map_bunker_ca.paa"); - m_Map_Map.AddUserMark("2670 4.7 1651", "Lala3", ARGB(255,0,0,255), "\\dz\\gear\\navigation\\data\\map_busstop_ca.paa"); */ + m_Config_Map_Teleport.SetChecked(true); + }else + { + m_Config_Map_Teleport.SetChecked(false); } + + if (GetAdminMenuManager().Config_Map_Horde) + { + m_Config_Map_Horde.SetChecked(true); + }else + { + m_Config_Map_Horde.SetChecked(false); + } + } void ~AdminMenuGuiMap() { } + void Update() + { + if (PointerMap) { + int X, Y; + vector Map; + GetMousePos(X, Y); + Map = m_Map_Map.ScreenToMap(Vector(X, Y, 0)); + m_Text_Map_Location.SetText("X: " + Map[0] + " Y: " + Map[2]); + + if (GetAdminMenuManager().Config_Map_Teleport && PointerMap && GetMouseState(MouseState.LEFT) < 0) { + if (TpOK) { + TpOK = false; + // Send tp rpc + ScriptRPC TListDst = new ScriptRPC(); + TListDst.Write( Map[0] ); + TListDst.Write( Map[2] ); + TListDst.Send(NULL, M_RPCs.M_Admin_Menu_TpMeToPosVec, false, NULL); + } + } else { + if (!TpOK) TpOK = true; + } + + if (GetAdminMenuManager().Config_Map_Horde && PointerMap && GetMouseState(MouseState.LEFT) < 0) { + if (HordeOK) { + HordeOK = false; + m_HordeModule.Spawn(Map, GetHordeCount()) + } + } else { + if (!HordeOK) HordeOK = true; + } + } + } + + void MouseEnter(Widget w, int x, int y ) + { + GetAdminMenuManager().CanClose = false; + } + + void MouseLeave(Widget w, Widget enterW, int x, int y) + { + GetAdminMenuManager().CanClose = true; + } + + int GetHordeCount() + { + return m_editbox_Map_HordeCount.GetText().ToInt(); + } + + void Set_Map_Teleport() + { + if (GetAdminMenuManager().Config_Map_Teleport) + { + GetAdminMenuManager().Config_Map_Teleport = false; + }else + { + GetAdminMenuManager().Config_Map_Teleport = true; + } + } + + void Set_Map_Horde() + { + if (GetAdminMenuManager().Config_Map_Horde) + { + GetAdminMenuManager().Config_Map_Horde = false; + }else + { + GetAdminMenuManager().Config_Map_Horde = true; + } + } + + bool OnMouseLeave( Widget w, int x, int y ) + { + if ( w == m_Map_Map ) { + PointerMap = false; + return true; + } + return false; + } + + bool OnMouseEnter( Widget w, int x, int y ) { + if ( w == m_Map_Map ) { + + PointerMap = true; + return true; + } + if ( w == m_helper_Map_MouseLeave ) { + PointerMap = false; + return true; + } + return false; + } + void Focus() { @@ -57,7 +172,7 @@ protected MapWidget m_Map_Map; void Message( string txt ) { - GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); + // GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); } void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) @@ -77,8 +192,6 @@ protected MapWidget m_Map_Map; if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) { AddPlayerMarker(PosName, Pos1); - string msg = "AdminMenuMap - M_RPCs.M_Admin_Menu_Map_Player Adding " + PosName + " Pos :" + Pos1 + " To List"; - GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Log_Debug, new Param1( msg ), false, NULL ); } break; } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuPlayer.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuPlayer.c index edf29b1..798d309 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuPlayer.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuPlayer.c @@ -22,7 +22,7 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler protected Widget m_Root; - + ref AdminMenuManager AMenuM; protected AdminMenuGui m_Menu; protected ref map> m_TextMap; @@ -36,16 +36,16 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler protected ButtonWidget m_btn_Player_HealAll; protected ButtonWidget m_btn_Player_StripAll; protected ButtonWidget m_btn_Player_TpMeAll; + protected ButtonWidget m_btn_Player_Spectate; protected ButtonWidget m_btn_Player_Send; protected TextWidget m_Text_Player_Blood; protected TextWidget m_Text_Player_Health; protected TextWidget m_Text_Player_Pos; protected TextWidget m_Text_Player_Stamina; - protected EditBoxWidget m_Box_Player_Message; + EditBoxWidget m_Box_Player_Message; CheckBoxWidget m_Cb_Player_Stamina; TextListboxWidget m_PlayerList; - void AdminMenuGuiPlayer( Widget parent, AdminMenuGui menu ) { @@ -65,6 +65,7 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler m_btn_Player_HealAll = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Player_HealAll" ) ); m_btn_Player_StripAll = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Player_StripAll" ) ); m_btn_Player_TpMeAll = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Player_tpMeAll" ) ); + m_btn_Player_Spectate = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Player_Spectate" ) ); m_btn_Player_Send = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Player_Send" ) ); m_Text_Player_Blood = TextWidget.Cast( m_Root.FindAnyWidget( "Text_Player_Blood" ) ); m_Text_Player_Health = TextWidget.Cast( m_Root.FindAnyWidget( "Text_Player_Energy" ) ); @@ -72,7 +73,10 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler m_Cb_Player_Stamina = CheckBoxWidget.Cast( m_Root.FindAnyWidget( "Cb_Player_Stamina" ) ); //PlayerList(); GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_List_Request, new Param1(""), false, NULL ); + } + + void LogD(string s) { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Log_Debug, new Param1( s ), false, NULL ); @@ -112,7 +116,6 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler if( ( w == m_btn_Player_TpMe ) ) { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_TpMe, new Param1(PlayerName), false, NULL ); - LogD("AdminMenuPlayer - Click - m_btn_Player_TpMe Playername : " + PlayerName); return true; } @@ -147,12 +150,22 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler return true; } + if( ( w == m_btn_Player_Spectate ) ) + { + if(GetAdminMenuManager().IsSpectate()) + { + GetAdminMenuManager().CamSpectate(GetAdminMenuManager().IsSpectate(), GetCurrentSelection(), false, vector.Zero, false); + GetAdminMenuManager().SetSpectate(); + return true; + } + GetAdminMenuManager().CamSpectate(GetAdminMenuManager().IsSpectate(), GetCurrentSelection(), false, vector.Zero, true); + GetAdminMenuManager().SetSpectate(); + return true; + } + if( ( w == m_btn_Player_Send ) ) { - ScriptRPC MSG = new ScriptRPC(); - MSG.Write(m_Box_Player_Message.GetText()); - MSG.Write(GetCurrentSelection()); - MSG.Send(NULL, M_RPCs.M_Admin_Menu_Spawn_Inventory, false, NULL); + TL().all(m_Box_Player_Message.GetText()); return true; } return true; @@ -173,6 +186,24 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler } void ~AdminMenuGuiPlayer() { + GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).Remove( this.UpdateStats ); + } + + void MouseEnter(Widget w, int x, int y ) + { + if ( w == m_Box_Player_Message ) + { + //TL().player(PlayerBase.Cast( GetGame().GetPlayer()).GetIdentity(), "Cant close !"); + GetAdminMenuManager().CanClose = false; + } + } + + void MouseLeave(Widget w, Widget enterW, int x, int y) + { + if ( w == m_Box_Player_Message ) + { + GetAdminMenuManager().CanClose = true; + } } void Focus() @@ -199,6 +230,7 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) { + int i; switch(rpc_type) { @@ -245,23 +277,33 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler break; case M_RPCs.M_Admin_Menu_Player_List: - string ListName; - ctx.Read(ListName); + array allplayers = new array; + ctx.Read(allplayers); + if ( GetGame().IsServer() ) { } if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) { - m_PlayerList.AddItem( ListName, NULL, 0 ); - string msg = "AdminMenuMap - M_RPCs.M_Admin_Menu_Player_List Adding " + ListName; - GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Log_Debug, new Param1( msg ), false, NULL ); + m_PlayerList.ClearItems(); + for (i = 0; i < allplayers.Count(); ++i) + { + m_PlayerList.AddItem( allplayers[i], NULL, 0 ); + } + } + break; + + case M_RPCs.M_Admin_Menu_Player_List_Clear: + if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + { + m_PlayerList.ClearItems(); } break; } } - void PlayerSelect() + void UpdateStats()//Remove { array players = new array; GetGame().GetPlayers( players ); @@ -273,24 +315,46 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler selectedIdentity = selectedPlayer.GetIdentity(); if ( selectedIdentity.GetName() == GetCurrentSelection() ) { - GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Health_Request, new Param1(selectedPlayer), false, NULL ); + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Stamina_Request, new Param1(selectedIdentity.GetName()), false, NULL ); + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Health_Request, new Param1(selectedIdentity.GetName()), false, NULL ); + } + } + //GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Health_Request, new Param1(selectedPlayer), false, NULL ); + } + + void PlayerSelect() + { + //GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Stamina_Request, new Param1(GetCurrentSelection() ), false, NULL ); + array players = new array; + GetGame().GetPlayers( players ); + PlayerBase selectedPlayer; + PlayerIdentity selectedIdentity; + for ( int a = 0; a < players.Count(); ++a ) + { + selectedPlayer = PlayerBase.Cast(players.Get(a)); + selectedIdentity = selectedPlayer.GetIdentity(); + if ( selectedIdentity.GetName() == GetCurrentSelection() ) + { + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Health_Request, new Param1(selectedIdentity.GetName()), false, NULL ); GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Stamina_Request, new Param1(selectedIdentity.GetName()), false, NULL ); } } + GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( this.UpdateStats, 1500, true ); + } void PlayerList() { - // m_PlayerList.ClearItems(); - // array players = new array; - // GetGame().GetPlayers( players ); - // for (int i = 0; i < players.Count(); ++i) - // { - // string msg = "AdminMenuPlayer - PlayerList() Adding " + players.Get(i).GetIdentity().GetName() + " To List"; - // GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Log_Info, new Param1( msg ), false, NULL ); - // m_PlayerList.AddItem( players.Get(i).GetIdentity().GetName(), NULL, 0 ); - // } + m_PlayerList.ClearItems(); + array players = new array; + GetGame().GetPlayers( players ); + for (int i = 0; i < players.Count(); ++i) + { + string msg = "AdminMenuPlayer - PlayerList() Adding " + players.Get(i).GetIdentity().GetName() + " To List"; + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Log_Info, new Param1( msg ), false, NULL ); + m_PlayerList.AddItem( players.Get(i).GetIdentity().GetName(), NULL, 0 ); + } } string GetCurrentSelection() @@ -307,7 +371,7 @@ class AdminMenuGuiPlayer extends ScriptedWidgetEventHandler void Message( string txt ) { - GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); + // GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuSpawn.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuSpawn.c index 3e08cdd..05c8285 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuSpawn.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuSpawn.c @@ -19,7 +19,10 @@ */ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler { + + protected Widget m_Root; + protected AdminMenuGui m_Menu; TextListboxWidget m_classList; EditBoxWidget m_Spawn_SearchBox; @@ -27,9 +30,9 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler protected ButtonWidget m_Spawn_btnSpawnCursor; protected ButtonWidget m_Spawn_btnSpawnInventory; protected ButtonWidget m_Spawn_btnCancel; - protected EditBoxWidget m_Spawn_QuantityItem; + EditBoxWidget m_Spawn_QuantityItem; ItemPreviewWidget m_item_widget; - + //ref AdminMenuManager AMenuM; //private ItemPreviewWidget m_item_widget; protected EntityAI previewItem; private int m_characterRotationX; @@ -64,6 +67,7 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler //TODO bool Click( Widget w, int x, int y, int button ) { + string strSelection = GetCurrentSelection(); bool ai = false; @@ -139,10 +143,43 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler } return false; + } + void MouseLeave(Widget w, Widget enterW, int x, int y) + { + + if ( w == m_Spawn_QuantityItem ) + { + GetAdminMenuManager().CanClose = true; + } + + if ( w == m_Spawn_SearchBox ) + { + GetAdminMenuManager().CanClose = true; + } + + } + + void MouseEnter(Widget w, int x, int y) + { + + if ( w == m_Spawn_QuantityItem ) + { + GetAdminMenuManager().CanClose = false; + } + + if ( w == m_Spawn_SearchBox ) + { + GetAdminMenuManager().CanClose = false; + } + + } + + void UpdateList( string classFilter ) // All default { + m_classList.ClearItems(); TStringArray configs = new TStringArray; configs.Insert( CFG_VEHICLESPATH ); @@ -195,6 +232,7 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler } } } + } string GetCurrentSelection() @@ -216,7 +254,7 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler bool OnItemSelect( Widget w, int x, int y, int row, int column, int oldRow, int oldColumn) { - + /* if ( w == m_classList ) { EntityAI item; @@ -255,12 +293,12 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler return true; } return true; - + */ } void OnItemSelect2(EntityAI item) { - + /* if (item) @@ -294,6 +332,7 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler //m_item_widget.SetModelOrientation PPEffects.SetBlurInventory(1); } + */ } override bool OnMouseButtonDown( Widget w, int x, int y, int button ) @@ -396,7 +435,7 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler void Message( string txt ) { - GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); + // GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); } void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) @@ -416,10 +455,15 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler void SetItem(EntityAI item) { + /* if (item) { + //InspectMenuNew.UpdateItemInfo(m_Root, item); //delete m_item_widget; + + + if (item == NULL) { item = EntityAI.Cast(GetGame().CreateObject( "WaterBottle", vector.Zero, false, false )); @@ -451,6 +495,7 @@ class AdminMenuGuiSpawn extends ScriptedWidgetEventHandler //m_item_widget.SetModelOrientation //PPEffects.SetBlurInventory(1); } + */ } override bool OnFocus( Widget w, int x, int y ) diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuTeleport.c b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuTeleport.c index e7ca0c8..c267def 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuTeleport.c +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuTeleport.c @@ -19,6 +19,7 @@ */ class AdminMenuGuiTeleport extends ScriptedWidgetEventHandler { + protected Widget m_Root; @@ -29,77 +30,150 @@ class AdminMenuGuiTeleport extends ScriptedWidgetEventHandler protected ButtonWidget m_btn_Teleport_Teleport; protected ButtonWidget m_btn_Teleport_Reload; protected ButtonWidget m_btn_Teleport_Add_Location; - ref AdminMenuManager adminMenuManager; - protected EditBoxWidget m_Text_Teleport_Loacation_Name; + protected ButtonWidget m_btn_Teleport_Spawn_Horde; + //ref AdminMenuManager adminMenuManager; + EditBoxWidget m_Text_Teleport_Loacation_Name; + EditBoxWidget m_editbox_Teleport_HordeCount; static ref map m_TeleportLocations; static ref map m_TeleportLocations_old; TextListboxWidget m_List_Teleport_Location; - - + ref array TLoacations; + ref array TPos; + ref HordeModule m_HordeModule; + //ref AdminMenuManager AMenuM; + void AdminMenuGuiTeleport( Widget parent, AdminMenuGui menu ) { m_Root = GetGame().GetWorkspace().CreateWidgets( "com\\DayZ-SA-Tomato\\scripts\\5_Mission\\core\\modules\\GUI\\Layouts\\Admin_Teleport.layout", parent ); - adminMenuManager = new AdminMenuManager(); + //adminMenuManager = new AdminMenuManager(); + m_HordeModule = new ref HordeModule(); m_Menu = menu; GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); m_TeleportLocations = new map; m_TeleportLocations_old = new map; m_List_Teleport_Location = TextListboxWidget.Cast( m_Root.FindAnyWidget( "List_Teleport_Location" ) ); m_Text_Teleport_Loacation_Name = EditBoxWidget.Cast( m_Root.FindAnyWidget( "Text_Teleport_Loacation_Name" ) ); + m_editbox_Teleport_HordeCount = EditBoxWidget.Cast( m_Root.FindAnyWidget( "editbox_Teleport_HordeCount" ) ); m_btn_Teleport_Teleport = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Teleport_Teleport" ) ); m_btn_Teleport_Reload = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Teleport_Reload" ) ); m_btn_Teleport_Add_Location = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Teleport_Add_Location" ) ); - - m_List_Teleport_Location.ClearItems(); + m_btn_Teleport_Spawn_Horde = ButtonWidget.Cast( m_Root.FindAnyWidget( "btn_Teleport_Spawn_Horde" ) ); + //m_List_Teleport_Location.ClearItems(); //TpLocations; - GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Teleport_List_Request, new Param1(""), false, NULL ); + // for ( int i = 0; i < m_Root.Locations.Count(); i++ ) + // { + // m_List_Teleport_Location.AddItem( GetAdminMenu().Locations[i], NULL, 0 ); + // } + + Print("Request Data"); + + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Teleport_RequestData, new Param1(""), false, NULL ); + } + void MouseLeave(Widget w, Widget enterW, int x, int y) + { + if ( w == m_Text_Teleport_Loacation_Name ) + { + GetAdminMenuManager().CanClose = true; + } + + if ( w == m_editbox_Teleport_HordeCount ) + { + GetAdminMenuManager().CanClose = true; + } + } + + void MouseEnter(Widget w, int x, int y ) + { + if ( w == m_Text_Teleport_Loacation_Name ) + { + GetAdminMenuManager().CanClose = false; + } + + if ( w == m_editbox_Teleport_HordeCount ) + { + GetAdminMenuManager().CanClose = false; + } + } + + void DeleteTeleportLocation() + { + m_List_Teleport_Location.ClearItems(); + } + + int GetHordeCount() + { + return m_editbox_Teleport_HordeCount.GetText().ToInt(); + } + + void AddTeleportLocation(string name) + { + m_List_Teleport_Location.AddItem( name, NULL, 0 ); + } void LogD(string s) { GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Log_Debug, new Param1( s ), false, NULL ); } bool Click(Widget w, int x, int y, int button) { + PlayerBase player = PlayerBase.Cast( GetGame().GetPlayer() ); string TpLocation = GetCurrentSelection(); if (player) { if( ( w == m_btn_Teleport_Teleport ) ) { - string TpDest; - - m_TeleportLocations.Find(TpLocation, TpDest); - Print("TpLocation : " + TpLocation + " Tp Dest : " + TpDest); - //GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_TpMeToPos, new Param1(TpDest.ToString()), false, NULL ); - ScriptRPC TListDst = new ScriptRPC(); - TListDst.Write(TpDest); - TListDst.Send(NULL, M_RPCs.M_Admin_Menu_TpMeToPos, false, NULL); - return true; + for (int t = 0; t < GetFileHandler().RootTeleport.Children.Count(); ++t) + { + if(GetFileHandler().RootTeleport.Children[t].LocationName == TpLocation) + { + ScriptRPC TListDst = new ScriptRPC(); + TListDst.Write( GetFileHandler().RootTeleport.Children[t].LocationPos[0] ); + TListDst.Write( GetFileHandler().RootTeleport.Children[t].LocationPos[2] ); + TListDst.Send(NULL, M_RPCs.M_Admin_Menu_TpMeToPosVec, false, NULL); + + } + } } if( ( w == m_btn_Teleport_Reload ) ) { - m_TeleportLocations.Clear(); - m_List_Teleport_Location.ClearItems(); - GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Teleport_List_Request, new Param1(""), false, NULL ); + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Teleport_RequestData, new Param1(""), false, NULL ); } if( ( w == m_btn_Teleport_Add_Location ) ) { - - - m_List_Teleport_Location.ClearItems(); - GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Teleport_List_Request, new Param1(""), false, NULL ); + string text = m_Text_Teleport_Loacation_Name.GetText(); + SendToFile(text); + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Teleport_RequestData, new Param1(""), false, NULL ); + } + + if( ( w == m_btn_Teleport_Spawn_Horde ) ) + { + int HCount = GetHordeCount(); + for (t = 0; t < GetFileHandler().RootTeleport.Children.Count(); ++t) + { + if(GetFileHandler().RootTeleport.Children[t].LocationName == TpLocation) + { + m_HordeModule.Spawn(GetFileHandler().RootTeleport.Children[t].LocationPos, GetHordeCount(), 50, GetCurrentSelection()) + } + } } } return true; + + } + void SendToFile(string name) + { + ScriptRPC Adding = new ScriptRPC(); + Adding.Write(name); + Adding.Send(NULL, M_RPCs.M_Admin_Menu_Teleport_Write_Pre, false, NULL); } - void ~AdminMenuGuiTeleport() { - m_List_Teleport_Location.ClearItems(); + } void Focus() @@ -111,8 +185,10 @@ class AdminMenuGuiTeleport extends ScriptedWidgetEventHandler { } + override bool OnFocus( Widget w, int x, int y ) { + /* if( m_Menu ) m_Menu.OnFocus( w, x, y ); if( w ) @@ -125,88 +201,48 @@ class AdminMenuGuiTeleport extends ScriptedWidgetEventHandler } return ( w != null ); + */ } bool stop = false; + + void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) { - int ListCount = 0; + int ListCount = 0; + ref array TLoacations = new ref array< string >; + ref array TPos = new ref array< vector >; + PlayerBase Admin; switch(rpc_type) { - - case M_RPCs.M_Admin_Menu_Teleport_List: - string PosName; - vector Pos1; //Vector Postition - // ctx.Read(PosName); - // ctx.Read(Pos1); - ctx.Read(m_TeleportLocations_old); - //ctx.Read(m_TeleportLocations); - - if ( GetGame().IsServer() ) - { - - } - if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) - { - - for (int i = 0; i < m_TeleportLocations_old.Count(); ++i) + case M_RPCs.M_Admin_Menu_Teleport_ReciveData: + Print("Data Recived"); + ref array TpName = new ref array< string >; + ref array TpPos = new ref array< vector >; + ctx.Read(TpName); + ctx.Read(TpPos); + Print("Data Count = " + TpName.Count()) + if ( GetGame().IsServer() ) { - ListCount ++; - string save; - string a =";"; - vector v; - TStringArray strs = new TStringArray; - save = m_TeleportLocations_old.GetElement(i); - save.Split(a, strs ); - v = strs.Get(1).ToVector(); - string Lname = strs.Get(0); - if (m_TeleportLocations.Contains(Lname)) - { - return; - } - m_TeleportLocations.Insert(Lname, strs.Get(1)); //int Name, posvector - m_List_Teleport_Location.AddItem( Lname, NULL, 0 ); - Print("SendTeleportList Number : " + i + " Name : " + Lname + "Pos : " + strs.Get(1)); + + } + if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + { + m_List_Teleport_Location.ClearItems(); + for ( int i = 0; i < TpName.Count(); i++ ) + { + TLoacations.Insert(TpName[i]) + TPos.Insert(TpPos[i]) + m_List_Teleport_Location.AddItem( TLoacations[i], NULL, 0 ); + Print("Client - Created Child with name = " + TpName[i]); + GetFileHandler().RootTeleport.AddChilds(TpName[i], TpPos[i]) + } + //Loadarray(); } - // Print("Adding : PosName : " + PosName + " Pos1 : " + Pos1); - // m_TeleportLocations.Insert(PosName, Pos1); //int Name, posvector - // m_List_Teleport_Location.AddItem( PosName, NULL, 0 ); - } break; } - } - - // void PlayerSelect() - // { - // array players = new array; - // GetGame().GetPlayers( players ); - // PlayerBase selectedPlayer; - // PlayerIdentity selectedIdentity; - // for ( int a = 0; a < players.Count(); ++a ) - // { - // selectedPlayer = players.Get(a); - // selectedIdentity = selectedPlayer.GetIdentity(); - // if ( selectedIdentity.GetName() == GetCurrentSelection() ) - // { - // GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Health_Request, new Param1(selectedPlayer), false, NULL ); - // GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Player_Stamina_Request, new Param1(selectedIdentity.GetName()), false, NULL ); - // } - // } - // } - - void PlayerList() - { - // m_PlayerList.ClearItems(); - // array players = new array; - // GetGame().GetPlayers( players ); - // for (int i = 0; i < players.Count(); ++i) - // { - // string msg = "AdminMenuPlayer - PlayerList() Adding " + players.Get(i).GetIdentity().GetName() + " To List"; - // GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_Log_Info, new Param1( msg ), false, NULL ); - // m_PlayerList.AddItem( players.Get(i).GetIdentity().GetName(), NULL, 0 ); - // } } string GetCurrentSelection() @@ -221,10 +257,10 @@ class AdminMenuGuiTeleport extends ScriptedWidgetEventHandler return ""; } - void Message( string txt ) - { - GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); - } + // void Message( string txt ) + // { + // GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", txt, "")); + // } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Commands.layout b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Commands.layout index ebd1274..27fb91a 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Commands.layout +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Commands.layout @@ -24,15 +24,6 @@ FrameWidgetClass rootFrame { vexactsize 1 text "Day" } - ButtonWidgetClass btn_Command_Cam { - position 750 165 - size 300 50 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - text "Camera" - } ButtonWidgetClass ButtonWidget2 { position 947.81403 -136.842 size 300 50 @@ -58,7 +49,7 @@ FrameWidgetClass rootFrame { vexactpos 1 hexactsize 1 vexactsize 1 - text "Refill" + text "Refuel" } CheckBoxWidgetClass Config_Cam { position 125 165 @@ -90,15 +81,6 @@ FrameWidgetClass rootFrame { style Default text "Heal" } - ButtonWidgetClass btn_Command_CamTp { - position 1100 165 - size 300 50 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - text "Camera (Tp)" - } ButtonWidgetClass btn_Command_SpCar { position 125 460 size 300 50 @@ -126,14 +108,14 @@ FrameWidgetClass rootFrame { vexactsize 1 text "Heal" } - ButtonWidgetClass ButtonWidget11 { - position 12.8862 -89.7536 - size 300 50 + ButtonWidgetClass btn_Command_DelObj { + position 125 560 + size 460.19101 50 hexactpos 1 vexactpos 1 hexactsize 1 vexactsize 1 - text "Heal" + text "Delete Obj on cursor" } TextWidgetClass TextWidget0 { position 0 10 @@ -172,24 +154,6 @@ FrameWidgetClass rootFrame { text "Teleport (n Key)" checked 0 } - ButtonWidgetClass btn_Command_Test { - position 152.78999 631.31201 - size 378.93399 48 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - text "Test Load Conf" - } - TextWidgetClass Text_Command_Test { - position 573.13898 627.05402 - size 342.647 48 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - text "Param" - } } } } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Config.layout b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Config.layout deleted file mode 100644 index bbea010..0000000 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Config.layout +++ /dev/null @@ -1,97 +0,0 @@ -FrameWidgetClass rootFrame { - position 10 10 - size 1400 800 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - { - FrameWidgetClass command_settings_root { - ignorepointer 1 - size 1 1 - hexactpos 1 - vexactpos 1 - hexactsize 0 - vexactsize 0 - { - TextWidgetClass TextWidget0 { - position 0 10 - size 1 50 - halign center_ref - hexactpos 1 - vexactpos 1 - hexactsize 0 - vexactsize 1 - style Bold - text "Config" - "exact text" 0 - "size to text h" 0 - "size to text v" 0 - "text halign" center - "text valign" center - } - PanelWidgetClass PanelWidget0 { - color 0.9333 0 0.0784 1 - position 0 75 - size 0.9 3.5 - halign center_ref - hexactpos 1 - vexactpos 1 - hexactsize 0 - vexactsize 1 - style rover_sim_colorable - } - ButtonWidgetClass btn_Config_Refresh_Admin { - position 1100 150 - size 256.392 48 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - text "Refresh Admins" - text_proportion 0.8 - } - TextWidgetClass TextWidget2 { - position 40 90 - size 167.963 49.9234 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - text "Admins" - } - ButtonWidgetClass btn_Config_Add_Admin { - position 800 150 - size 256.38998 50 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - text "Add Steam64ID" - text_proportion 0.9 - switch normal - } - PanelWidgetClass PanelWidget1 { - color 0.9333 0 0.0784 1 - position 0 223.85101 - size 0.9 3.5 - halign center_ref - hexactpos 1 - vexactpos 1 - hexactsize 0 - vexactsize 1 - style rover_sim_colorable - } - EditBoxWidgetClass Text_Config_Admin_ID { - position 40 150 - size 734.37097 48 - hexactpos 1 - vexactpos 1 - hexactsize 1 - vexactsize 1 - style ServerBrowser - } - } - } - } -} \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Main.layout b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Main.layout index 4dae70d..af871b6 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Main.layout +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Main.layout @@ -392,7 +392,7 @@ FrameWidgetClass settings_menu_root { hexactsize 0 vexactsize 0 priority 250 - text "Config" + text "About" font "gui/fonts/sdf_MetronLight72" "text halign" center "text valign" center @@ -657,6 +657,35 @@ FrameWidgetClass settings_menu_root { hexactsize 1 vexactsize 1 } + TextWidgetClass txt_Main_Ver { + clipchildren 0 + inheritalpha 0 + ignorepointer 0 + keepsafezone 0 + position 45 925 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + scaled 1 + text "Version : 0.00" + "text valign" center + } + MultilineTextWidgetClass txt_Main_Status { + color 0.2314 0.8902 0.3176 1 + position 303.22601 912.25702 + size 819.32703 60.2171 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + "text color" 0.2314 0.8902 0.3176 1 + "exact text" 0 + "text halign" center + "text valign" center + wrap 1 + } } } TextWidgetClass SettingsTextWidget { @@ -815,6 +844,7 @@ FrameWidgetClass settings_menu_root { } } WindowWidgetClass WindowWidget0 { + color 0.4235 0.0078 0.0078 1 position 0 0 size 1 1 hexactpos 1 @@ -822,6 +852,7 @@ FrameWidgetClass settings_menu_root { hexactsize 0 vexactsize 0 style rover_sim_black + "title visible" 0 } } } \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Map.layout b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Map.layout index 37538d4..2a0ac07 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Map.layout +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Map.layout @@ -41,7 +41,7 @@ FrameWidgetClass rootFrame { vexactsize 1 style rover_sim_colorable } - MapWidgetClass Map { + MapWidgetClass Map_Map_Main { position 0 20 size 0.9 580 halign center_ref @@ -51,6 +51,42 @@ FrameWidgetClass rootFrame { hexactsize 0 vexactsize 1 } + TextWidgetClass Text_Map_Location { + position 71.4134 126.686 + size 573.94202 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + } + CheckBoxWidgetClass Config_Map_Teleport { + position 725 90 + size 402.19901 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "Teleport on left click" + } + CheckBoxWidgetClass Config_Map_Horde { + position 725 145 + size 402.19901 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "Horde on left click" + } + EditBoxWidgetClass editbox_Map_HordeCount { + position 1176.23999 145 + size 99.59319 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "50" + "Use default text" 1 + } } } } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Player.layout b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Player.layout index e20fe38..c5cf689 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Player.layout +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Player.layout @@ -214,13 +214,24 @@ FrameWidgetClass rootFrame { text "Teleport all here" } CheckBoxWidgetClass Cb_Player_Stamina { - position 610 450 + position 610 500 size 350 48 hexactpos 1 vexactpos 1 hexactsize 1 vexactsize 1 - text "Disable Stamina" + text "Dissable Stamina" + } + ButtonWidgetClass btn_Player_Spectate { + visible 1 + clipchildren 1 + position 610 445 + size 350 45 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "Spectate" } } } @@ -253,7 +264,7 @@ FrameWidgetClass rootFrame { vexactpos 1 hexactsize 1 vexactsize 1 - text "Energy :" + text "Health :" "text halign" center "text valign" center } diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Teleport.layout b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Teleport.layout index edea356..5bb4e2e 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Teleport.layout +++ b/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_Teleport.layout @@ -86,7 +86,7 @@ FrameWidgetClass rootFrame { vexactpos 1 hexactsize 1 vexactsize 1 - text "Reload Locations from File" + text "Reload from File" } EditBoxWidgetClass Text_Teleport_Loacation_Name { position 904.15796 680 @@ -96,7 +96,7 @@ FrameWidgetClass rootFrame { hexactsize 1 vexactsize 1 style ServerBrowser - text "Location_Name" + text "Location Name" } TextWidgetClass TextWidget1 { position 20 100 @@ -109,6 +109,34 @@ FrameWidgetClass rootFrame { "text halign" center "text valign" center } + ButtonWidgetClass btn_Teleport_Teleport0 { + visible 0 + position 450 600 + size 431.70602 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "Remove selected" + } + ButtonWidgetClass btn_Teleport_Spawn_Horde { + position 450 220 + size 431.70602 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "Spawn Horde On Location" + } + EditBoxWidgetClass editbox_Teleport_HordeCount { + position 900 220 + size 92.16299 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "50" + } } } } diff --git a/Dayz-Sa-Tomato/Tomato_Profiles/Config/Config.txt b/Dayz-Sa-Tomato/Tomato_Profiles/Config/Config.txt new file mode 100644 index 0000000..b68d131 --- /dev/null +++ b/Dayz-Sa-Tomato/Tomato_Profiles/Config/Config.txt @@ -0,0 +1,18 @@ +Setup = 1 +Horde_Message = 1 +Horde_Message_Location = Horde appeared near {Location} +Welcome_Message = 0 +Welcome_Message_Join = {Player} just joined the Server +KillFeed_LogToFile = 0 +KillFeed_Message_Suicide = 0 +KillFeed_Suicide = {Killed} took his own life +KillFeed_Message_PlayerHand = 0 +KillFeed_ByPlayerHand = {Killed} murdered by {Killer} with his Hands +KillFeed_Message_PlayerWeapon = 0 +KillFeed_ByPlayerWeapon = {Killed} murdered by {Killer} with Weapon {Weapon} from {Distance}m +KillFeed_Message_Zombie = 0 +KillFeed_Zombie = {Killed} died by a zombie +KillFeed_Message_Animal = 0 +KillFeed_Animal = {Killed} died by a Wild Animal +KillFeed_Message_Unkown = 0 +KillFeed_Unknown = {Killed} died diff --git a/Dayz-Sa-Tomato/Tomato_Profiles/Customization/Teleport_Locations.txt b/Dayz-Sa-Tomato/Tomato_Profiles/Customization/Teleport_Locations.txt new file mode 100644 index 0000000..a302424 --- /dev/null +++ b/Dayz-Sa-Tomato/Tomato_Profiles/Customization/Teleport_Locations.txt @@ -0,0 +1,18 @@ +Prison Island = 2651.42 0.0 1395.8 +Mogilevka = 7572.65 0.0 5182.3 +Stary Sobor = 6192.39 0.0 7666.5 +Msta = 11206.6 0.0 5398.70 +Solnichniy = 13436.5 0.0 6158.7 +Chernogorsk = 6350.99 0.0 2666.12 +Elektrogorsk = 10432.1 0.0 2218.56 +Berezino = 12661.4 0.0 9465.03 +Tisy = 1890.45 0.0 13704.6 +Gorka = 9678.94 0.0 8828.93 +Balota = 4546.92 0.0 2416.4 +Vybor = 3916.85 0.0 8795.59 +Severograd = 8318.51 0.0 12743.4 +North West Airfield = 4835.59 0.0 9667.72 +Green Mountain = 3752.08 0.0 6002.94 +Zelenogorsk = 2542.18 0.0 4994.26 +Tisy Military Base = 1599.15 0.0 14166.66 +Pavlovo Military Base = 2047.82 0.0 3293.36 diff --git a/Dayz-Sa-Tomato/Tomato_Profiles/Log/Admin.txt b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Admin.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Admin.txt @@ -0,0 +1 @@ + diff --git a/Dayz-Sa-Tomato/Tomato_Profiles/Log/Debug.txt b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Debug.txt new file mode 100644 index 0000000..4fe1117 --- /dev/null +++ b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Debug.txt @@ -0,0 +1,2 @@ + +[02.01.2019 21:21] - y diff --git a/Dayz-Sa-Tomato/Tomato_Profiles/Log/Error.txt b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Error.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Error.txt @@ -0,0 +1 @@ + diff --git a/Dayz-Sa-Tomato/Tomato_Profiles/Log/Info.txt b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Info.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Info.txt @@ -0,0 +1 @@ + diff --git a/Dayz-Sa-Tomato/Tomato_Profiles/Log/Kills.txt b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Kills.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/Dayz-Sa-Tomato/Tomato_Profiles/Log/Kills.txt @@ -0,0 +1 @@ + diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/DayZ-SA-Tomato.pbo.SchnitzelPommes.bisign b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/DayZ-SA-Tomato.pbo.SchnitzelPommes.bisign new file mode 100644 index 0000000000000000000000000000000000000000..20c7c23982c2dae57163babed750b94380aab125 GIT binary patch literal 568 zcmV-80>}MRV`y$^bb4iMP;YH*WpeZL0ib}uIT;#vpH5k5|TnZYyCT-w$jF_^G)PweY;|jM*_k78LS7Zd zyNAFcL4a@#%?xu2nRYI8wT-ZV0002vr?`Au^os&}(K>$@=J7K->_z;91C!&3TRKR6Ga6PxRno^5moL2l&pz3qA9Q*K*>xrYzznnd-0xtviTA47c09&3Tf zVLD{?#ze+O=s%a*o4fa~lyxup@bUAlGCv;SqVDY32G|0}Aa*slk3WIV@~z-Yj`+5K znh}ajh|fc!8jN<@F. + */ +enum ConfigType +{ + false, true, next, custom +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Config/FileConfig.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Config/FileConfig.c new file mode 100644 index 0000000..d76840c --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Config/FileConfig.c @@ -0,0 +1,289 @@ +/* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class FileConfig +{ + ref array< ref FileConfig > Children; + string ConfigName; + ConfigType IsConfigType; + string ConfigData; + ref FileConfig Parent; + void FileConfig( string name, ConfigType type = true, string data = "", ref FileConfig parent = NULL ) + { + ConfigName = name; + IsConfigType = type; + ConfigData = data; + Parent = parent; + + IsConfigType = ConfigType.next; + if ( Parent == NULL ) + { + IsConfigType = ConfigType.true; + } + + Children = new ref array< ref FileConfig >; + } + + void WriteToFile() + { + array ConfigNames = new array; + array ConfigTypes = new array; + string type; + for ( int i = 0; i < Children.Count(); i++ ) + { + ConfigNames.Insert(Children[i].ConfigName); + + if(Children[i].IsConfigType == ConfigType.true) + { + type = "1"; + }else if(Children[i].IsConfigType == ConfigType.custom) + { + type = Children[i].ConfigData; + }else + { + type = "0"; + } + ConfigTypes.Insert(type); + } + + FileHandle file = OpenFile( GetFileHandler().ConfigFile, FileMode.WRITE ); + + if ( file != 0 ) + { + + for ( int t = 0; t < ConfigNames.Count(); t++ ) + { + string WriteData = ConfigNames[t] + " = " + ConfigTypes[t]; + FPrintln( file, WriteData ); + } + + CloseFile(file); + + Print("Wrote Config to File" + GetFileHandler().ConfigFile); + } else + { + Print("Could not open File " + GetFileHandler().ConfigFile + " to Write Config to!"); + } + } + + void ~FileConfig() + { + //delete Children; + } + + bool IsConfig( string Configname ) + { + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( Children[i].ConfigName == Configname && Children[i].IsConfigType == ConfigType.true) + { + return true; + } + } + return false; + } + + string GetConfigData( string Configname ) + { + string ReturnData = ""; + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( Children[i].ConfigName == Configname ) //&& Children[i].IsConfigType == ConfigType.custom + { + ReturnData = Children[i].ConfigData; + return ReturnData; + } + } + return ReturnData; + } + + void SetConfigType(ConfigType type) + { + + IsConfigType = type; + //GetFileHandler().RootConfig.WriteToFile() + + } + + void SetConfigData(string data) + { + ConfigData = data; + //GetFileHandler().RootConfig.WriteToFile() + } + + void PrintAll() + { + for ( int i = 0; i < Children.Count(); i++ ) + { + Print(" "); + Print("Printing Child with number " + i); + Print("Name = " + Children[i].ConfigName); + Print("ConfigType = " + Children[i].IsConfigType); + Print("ConfigData = " + Children[i].ConfigData); + Print("Parent = " + Children[i].Parent); + Print("End Of Child with Number " + i); + Print(" "); + } + } + + void ConfigInitialize() + { + array ConfigLine = new array; + array ConfigStringCut = new array; + FileHandle file = OpenFile( GetFileHandler().ConfigFile, FileMode.READ ); + if ( file != 0 ) + { + Print("ConfigInitialize - File Found"); + string line; + + while ( FGets( file, line ) > 0 ) + { + ConfigLine.Insert( line ); + } + + CloseFile( file ); + + if(Children.Count() == ConfigLine.Count() ) + { + for ( int i = 0; i < ConfigLine.Count(); i++ ) + { + ConfigStringCut.Clear(); + ConfigLine[i].Split( " = ", ConfigStringCut ); + ConfigType type; + string configData = ""; + if(ConfigLine.Count() == Children.Count()) + { + int len = ConfigStringCut[1].LengthUtf8(); + len = len - 2; + string ConfigTypeCut = ConfigStringCut[1].Substring(2, len); + if(ConfigTypeCut == "1") + { + type = ConfigType.true; + }else if(ConfigTypeCut == "0") + { + type = ConfigType.false; + }else + { + type = ConfigType.custom; + configData = ConfigTypeCut; + + } + }else + { + if(ConfigStringCut[1] == "= 1") + { + type = ConfigType.true; + }else if(ConfigStringCut[1] == "= 0") + { + type = ConfigType.false; + }else + { + type = ConfigType.custom; + configData = ConfigTypeCut; + } + } + //Function needet TODO ! + Children[i].SetConfigType(type); + Children[i].SetConfigData(configData); + } + WriteToFile(); + }else + { + Print("Config File has Wrong number of Configs recreateing file !"); + WriteToFile(); + } + } else + { + Print( "File. " + GetFileHandler().ConfigFile + " Not found Creating new one"); + WriteToFile(); + } + } + + // void LoadConfig( string ConfigString, ConfigType ConfigTypefunc = ConfigType.next ) + // { + + // array ConfigStringCut = new array; + // ConfigString.Split( " = ", ConfigStringCut ); + + // ConfigType type; + // if (ConfigStringCut.Count() == 2 ) // Loaded will be 1 + // { + // if ( ConfigStringCut[1].Contains( "1" ) ) + // { + // type = ConfigType.true; + // } else if ( ConfigStringCut[1].Contains( "0" ) ) + // { + // type = ConfigType.false; + // } else + // { + // type = ConfigType.false; + // } + // } else if ( ConfigStringCut.Count() < 2 ) //New One will Be Count 1 make Type what it should be + // { + // type = ConfigTypefunc; + + // } else { + // Print( "LoadConfig Error Given String : " + ConfigString + " and should be Config = 1 "); + // return; + // } + + // CheckIfNewConfig(ConfigStringCut[0], type); + + // } + void RegisterNewconfig(string name, string stype, string configdata = "") + { + Print("RegisterNewConfig Data = " + configdata) + ConfigType type; + if(stype == "true"){type = ConfigType.true;} + else if(stype == "false"){type = ConfigType.false;} + else{type = ConfigType.custom;} + CheckIfNewConfig(name, type, configdata); + } + + void CheckIfNewConfig( string name, ConfigType type, string configData = "" ) + { + Print("CheckIfNewConfig Data = " + configData) + ref FileConfig nChild = NULL; + + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( name == Children[i].ConfigName ) + { + nChild = Children[i]; + break; + } + } + + if ( nChild == NULL ) + { + nChild = new FileConfig( name, type, configData, this ); + //nChild.IsConfigType = type; + // nChild.ConfigData = configData; + Children.Insert( nChild ); + for ( i = 0; i < Children.Count(); i++ ) + { + if(Children[i].ConfigName == name) + { + Children[i].SetConfigType(type); + Children[i].SetConfigData(configData); + } + } + } + } +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/FPPermission.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/FPPermission.c new file mode 100644 index 0000000..dc4b8d6 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/FPPermission.c @@ -0,0 +1,269 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato, + however this File is Execludet from GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 since it is + + Originally from DayZ-CommunityOnlineTools + Link : https://github.com/Jacob-Mango/DayZ-CommunityOnlineTools + Created by Jacob-Mango + and Published under license (CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ + which means this file is under CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ Licence. + */ + +class FPPermission +{ + ref FPPermission Parent; + ref array< ref FPPermission > Children; + string Name; + PermissionType Type; + + + void FPPermission( string name, ref FPPermission parent = NULL ) + { + Name = name; + Parent = parent; + + Type = PermissionType.DISALLOW; + + if ( Parent == NULL ) + { + Type = PermissionType.DISALLOW; + } + + Children = new ref array< ref FPPermission >; + } + + void SetPermissionType(string name, PermissionType type) + { + Print("Permission"); + for ( int i = 0; i < Children.Count(); i++ ) + { + Print("Name 1 = " + Name + " Name 2 = " + name); + if(Children[i].Name == name) + { + Print("Permission Found Changeing"); + Children[i].SetPermissionInternal(type) + return; + } + } + + + } + + void SetPermissionInternal(PermissionType type) + { + Print("Type Set"); + Type = type; + } + + void AddPermission( string inp, PermissionType permType = PermissionType.DISALLOW ) + { + array tokens = new array; + + array spaces = new array; + inp.Split( " = ", spaces ); + + PermissionType type; + for ( int i = 0; i < spaces.Count(); i++ ) + {Print(spaces[i]);} + if (spaces.Count() == 2 ) + { + if ( spaces[1].Contains( "1" ) ) + { + type = PermissionType.ALLOW; + } else if ( spaces[1].Contains( "0" ) ) + { + type = PermissionType.DISALLOW; + } else + { + type = PermissionType.DISALLOW; + } + + spaces[0].Split( "_", tokens ); + } else if ( spaces.Count() < 2 ) + { + type = permType; + + inp.Split( "_", tokens ); + } else { + Print( "Warning, permission line improperly formatted! Read as \"" + inp + "\" but meant to be in format \"Perm_Perm {n}\"." ); + return; + } + + int depth = tokens.Find( Name ); + + if ( depth > -1 ) + { + AddPermissionInternal( tokens, depth + 1, type ); + } else + { + AddPermissionInternal( tokens, 0, type ); + } + } + + private ref FPPermission VerifyAddPermission( string name ) + { + ref FPPermission nChild = NULL; + + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( name == Children[i].Name ) + { + nChild = Children[i]; + break; + } + } + + if ( nChild == NULL ) + { + nChild = new FPPermission( name, this ); + nChild.Type = PermissionType.DISALLOW; + + Children.Insert( nChild ); + } + + return nChild; + } + + void ToPermArray( ref array< string > output, string prepend = "" ) + { + for ( int i = 0; i < Children.Count(); i++ ) + { + string serialize = prepend + Children[i].Name; + //TODO " = " + output.Insert( serialize + " = " + Children[i].Type ); + + if ( Children[i].Children.Count() > 0 ) + { + Children[i].ToPermArray( output, serialize + "_" ); + } + } + } + + bool HasPermission( string inp ) + { + array tokens = new array; + inp.Split( "_", tokens ); + + if ( tokens.Count() == 0 ) return false; + + int depth = tokens.Find(Name); + + bool parentDisallowed = false; + + if ( Type == PermissionType.DISALLOW ) + { + parentDisallowed = true; + } + + if ( depth > -1 ) + { + return Check( tokens, depth + 1, parentDisallowed ); + } else + { + return Check( tokens, 0, parentDisallowed ); + } + } + + bool Check( array tokens, int depth, bool parentDisallowed ) + { + bool ifReturnAs = false; + + if ( Type == PermissionType.ALLOW ) + { + ifReturnAs = true; + } + + if ( Type == PermissionType.DISALLOW ) + { + parentDisallowed = true; + } + + if ( Type == PermissionType.ALLOW ) + { + parentDisallowed = false; + } + + if ( depth < tokens.Count() ) + { + ref FPPermission nChild = NULL; + + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( Children[i].Name == tokens[depth] ) + { + nChild = Children[i]; + } + } + + if ( nChild ) + { + return nChild.Check( tokens, depth + 1, parentDisallowed ); + } + } + + return ifReturnAs; + } + + private ref FPPermission Get( array tokens, int depth ) + { + if ( depth < tokens.Count() ) + { + ref FPPermission nChild = NULL; + + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( Children[i].Name == tokens[depth] ) + { + nChild = Children[i]; + } + } + + if ( nChild ) + { + return nChild.Get( tokens, depth + 1 ); + } + } + + return this; + } + + ref FPPermission GetPermission( string inp ) + { + array tokens = new array; + inp.Split( "_", tokens ); + + int depth = tokens.Find(Name); + + if ( depth > -1 ) + { + return Get( tokens, depth + 1 ); + } else + { + return Get( tokens, 0 ); + } + } + + private void AddPermissionInternal( array tokens, int depth, PermissionType value ) + { + if ( depth < tokens.Count() ) + { + string name = tokens[depth]; + + ref FPPermission nChild = VerifyAddPermission( name ); + + nChild.AddPermissionInternal( tokens, depth + 1, value ); + } else { + Type = value; + } + } + + + void ~FPPermission() + { + delete Children; + } +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/FPPlayer.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/FPPlayer.c new file mode 100644 index 0000000..6a169ef --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/FPPlayer.c @@ -0,0 +1,204 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato, + however this File is Execludet from GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 since it is + + Originally from DayZ-CommunityOnlineTools + Link : https://github.com/Jacob-Mango/DayZ-CommunityOnlineTools + Created by Jacob-Mango + and Published under license (CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ + which means this file is under CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ Licence. + */ + +class FPPlayer +{ + ref FPPermission RootPermission; + + PlayerBase PlayerObject; + PlayerIdentity IdentityPlayer; + ref PlayerDataN Data; + + void FPPlayer(ref PlayerDataN data) + { + PlayerObject = NULL; + Data = data; + + if ( Data == NULL ) + { + Data = new ref PlayerDataN; + } + + RootPermission = new ref FPPermission( Data.SSteam64ID ); + + } + + void SetPermission(string name, PermissionType type) + { + Print("FPPlayer"); + RootPermission.SetPermissionType(name , type) + } + + string FileReadyStripName( string name ) + { + name.Replace( "\\", "" ); + name.Replace( "/", "" ); + name.Replace( "=", "" ); + name.Replace( "+", "" ); + + return name; + } + + bool Load() + { + string filename = FileReadyStripName( Data.SSteam64ID ); + Print( "Loading permissions for " + filename ); + FileHandle file = OpenFile( GetFileHandler().PlayersFolderPath + filename + ".Player", FileMode.READ ); + + ref array< string > data = new ref array< string >; + + if ( file != 0 ) + { + string line; + + while ( FGets( file, line ) > 0 ) + { + data.Insert( line ); + } + + CloseFile( file ); + + for ( int i = 0; i < data.Count(); i++ ) + { + AddPermission( data[i] ); + } + } else + { + Print( "Failed to open the file for the player to read. Attemping to create." ); + + Save(); + return false; + } + + return true; + } + + bool Save() + { + string filename = FileReadyStripName( Data.SSteam64ID ); + + Print( "Saving permissions for " + filename ); + FileHandle file = OpenFile( GetFileHandler().PlayersFolderPath + filename + ".Player", FileMode.WRITE ); + //TODO ?? + ref array< string > data = ToPermArray(); + + if ( file != 0 ) + { + string line; + + for ( int i = 0; i < data.Count(); i++ ) + { + FPrintln( file, data[i] ); + } + + CloseFile(file); + + Print("Wrote to the players"); + return true; + } else + { + Print("Failed to open the file for the player for writing."); + return false; + } + } + + void CopyPermissions( ref FPPermission copy ) + { + ref array< string > data = new ref array< string >; + copy.ToPermArray( data ); + + for ( int i = 0; i < data.Count(); i++ ) + { + AddPermission( data[i] ); + } + } + + ref array< string > ToPermArray() + { + Data.APermissions.Clear(); + + RootPermission.ToPermArray( Data.APermissions ); + + return Data.APermissions; + } + + void ToPermData() + { + for ( int i = 0; i < Data.APermissions.Count(); i++ ) + { + AddPermission( Data.APermissions[i] ); + } + } + + bool HasPermission( string fPPermission ) + { + return RootPermission.HasPermission( fPPermission ); + } + + void AddPermission( string fPPermission, PermissionType type = PermissionType.DISALLOW ) + { + RootPermission.AddPermission( fPPermission, type); + } + + void ClearPermissions() + { + delete RootPermission; + + RootPermission = new ref FPPermission( Data.SSteam64ID, NULL ); + } + + void UpdatePlayerDataN() + { + if ( IdentityPlayer == NULL ) return; + + Data.IPingMin = IdentityPlayer.GetPingMin(); + Data.IPingMax = IdentityPlayer.GetPingMax(); + Data.IPingAvg = IdentityPlayer.GetPingAvg(); + + Data.SSteam64ID = IdentityPlayer.GetPlainId(); + Data.SGUID = IdentityPlayer.GetId(); + Data.SName = IdentityPlayer.GetName(); + + if ( PlayerObject == NULL ) return; + + PlayerDataN.Load( Data, PlayerObject ); + } + + void NewData( ref PlayerDataN newData ) + { + Data = newData; + } + + void ~FPPlayer() + { + delete RootPermission; + } + + string GetGUID() + { + return Data.SGUID; + } + + string GetSteam64ID() + { + return Data.SSteam64ID; + } + + string GetName() + { + return Data.SName; + } + +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PermissionSystem.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PermissionSystem.c new file mode 100644 index 0000000..3a40496 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PermissionSystem.c @@ -0,0 +1,108 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato, + however this File is Execludet from GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 since it is + + Originally from DayZ-CommunityOnlineTools + Link : https://github.com/Jacob-Mango/DayZ-CommunityOnlineTools + Created by Jacob-Mango + and Published under license (CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ + which means this file is under CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ Licence. + */ +static ref FPPlayer ClientAuthPlayer; + +static ref array< ref FPPlayer > SELECTED_PLAYERS; + +ref array< ref FPPlayer > GetSelectedPlayers() +{ + if ( SELECTED_PLAYERS == NULL ) + { + SELECTED_PLAYERS = new ref array< ref FPPlayer >; + } + return SELECTED_PLAYERS; +} + +bool PlayerAlreadySelected( ref FPPlayer player ) +{ + int position = GetSelectedPlayers().Find( player ); + + return position > -1; +} + +int RemoveSelectedPlayer( ref FPPlayer player ) +{ + int position = GetSelectedPlayers().Find( player ); + + if ( position > -1 ) + { + GetSelectedPlayers().Remove( position ); + } + + return position; +} + +int AddSelectedPlayer( ref FPPlayer player ) +{ + int position = GetSelectedPlayers().Find( player ); + + if ( position > -1 ) + return position; + + return GetSelectedPlayers().Insert( player ); +} + +ref PlayerDataN SerializePlayer( ref FPPlayer player ) +{ + player.ToPermArray(); + + return player.Data; +} + +ref FPPlayer DeserializePlayer( ref PlayerDataN data ) +{ + return GetFileHandler().GetPlayer( data ); +} + +array< ref PlayerDataN > SerializePlayers( ref array< ref FPPlayer > players ) +{ + array< ref PlayerDataN > output = new array< ref PlayerDataN >; + + for ( int i = 0; i < players.Count(); i++) + { + output.Insert( SerializePlayer( players[i] ) ); + } + + return output; +} + +array< ref FPPlayer > DeserializePlayers( ref array< ref PlayerDataN > players ) +{ + array< ref FPPlayer > output = new array< ref FPPlayer >; + + for ( int i = 0; i < players.Count(); i++) + { + output.Insert( DeserializePlayer( players[i] ) ); + } + + return output; +} + +ref array< string > SerializePlayersGUID( array< ref FPPlayer > players ) +{ + ref array< string > output = new ref array< string >; + + for ( int i = 0; i < players.Count(); i++) + { + output.Insert( players[i].GetGUID() ); + } + + return output; +} + +array< ref FPPlayer > DeserializePlayersGUID( ref array< string > guids ) +{ + return GetFileHandler().GetPlayers( guids ); +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PermissionType.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PermissionType.c new file mode 100644 index 0000000..03fcdcd --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PermissionType.c @@ -0,0 +1,19 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato, + however this File is Execludet from GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 since it is + + Originally from DayZ-CommunityOnlineTools + Link : https://github.com/Jacob-Mango/DayZ-CommunityOnlineTools + Created by Jacob-Mango + and Published under license (CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ + which means this file is under CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ Licence. + */ + +enum PermissionType +{ + DISALLOW, ALLOW +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PlayerData.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PlayerData.c new file mode 100644 index 0000000..a592e03 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Player/PlayerData.c @@ -0,0 +1,81 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato, + however this File is Execludet from GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 since it is + + Originally from DayZ-CommunityOnlineTools + Link : https://github.com/Jacob-Mango/DayZ-CommunityOnlineTools + Created by Jacob-Mango + and Published under license (CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ + which means this file is under CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ Licence. + */ + +// STORE ALL PLAYERS DATA HERE FOR OUTSIDE NETWORK BUBBLE! + +class PlayerDataN +{ + string SName; + string SGUID; + string SSteam64ID; + + int IPingMax; + int IPingMin; + int IPingAvg; + + ref array< string > ARoles; + ref array< string > APermissions; + + vector VPosition; + vector VDirection; + vector VOrientation; + + float FHealth; + float FBlood; + float FShock; + + int IBloodStatType; + + float FEnergy; + float FWater; + + float FHeatComfort; + + float FWet; + float FTremor; + float FStamina; + + int Kills; + int TotalKills; + + int ILifeSpanState; + bool BBloodyHands; + + void PlayerDataN() + { + ARoles = new ref array< string >; + APermissions = new ref array< string >; + } + + static void Load( out PlayerDataN data, ref PlayerBase player ) + { + data.VPosition = player.GetPosition(); + data.VDirection = player.GetDirection(); + data.VOrientation = player.GetOrientation(); + + data.FHealth = player.GetHealth( "GlobalHealth","Health" ); + data.FBlood = player.GetHealth( "GlobalHealth", "Blood" ); + data.FShock = player.GetHealth( "GlobalHealth", "Shock" ); + data.IBloodStatType = player.GetStatBloodType().Get(); + data.FEnergy = player.GetStatEnergy().Get(); + data.FWater = player.GetStatWater().Get(); + data.FHeatComfort = player.GetStatHeatComfort().Get(); + data.FWet = player.GetStatWet().Get(); + data.FTremor = player.GetStatTremor().Get(); + data.FStamina = player.GetStatStamina().Get(); + data.ILifeSpanState = player.GetLifeSpanState(); + data.BBloodyHands = player.HasBloodyHands(); + } +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Tp_Locations/FileTeleport.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Tp_Locations/FileTeleport.c new file mode 100644 index 0000000..7916de4 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Tp_Locations/FileTeleport.c @@ -0,0 +1,187 @@ +/* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class FileTeleport +{ + ref array< ref FileTeleport > Children; + string LocationName; + vector LocationPos; + bool ok = false; + ref FileTeleport Parent; + void FileTeleport( string name, ref FileTeleport parent = NULL, vector pos = Vector.Zero()) + { + if(parent == NULL) + { + ok = true; + } + LocationName = name; + LocationPos = pos; + Parent = parent; + //Print("Teleport Location = " + LocationName + " LocationPos = " + LocationPos); + GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); + Children = new ref array< ref FileTeleport >; + } + + void AddNewLocation(string PosName, vector AdminPos) + { + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( PosName == Children[i].LocationName ) + { + return; + } + } + //PosName = stringParam.param1; + + vector PosOut; + PosOut = Vector(AdminPos[0], 0.0, AdminPos[2]); + string stringout = PosOut.ToString(false); + AddToFile(PosName, stringout); + Load(); + + } + + void AddToFile(string name, string pos) + { + FileHandle file = OpenFile( GetFileHandler().TeleportFile, FileMode.APPEND ); + if ( file != 0 ) + { + FPrintln(file, name + " = " + pos); + } + CloseFile(file); + } + + void AddChilds(string name, vector pos) + { + ref FileTeleport nChild = NULL; + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( name == Children[i].LocationName ) + { + nChild = Children[i]; + break; + } + } + + if ( nChild == NULL ) + { + nChild = new FileTeleport( name, this, pos); + + Children.Insert( nChild ); + } + + } + + void Load() + { + Children.Clear(); + FileHandle file = OpenFile( GetFileHandler().TeleportFile, FileMode.READ ); + if ( file != 0 ) + { + string line, LocationNameNew; + vector LocationPosNew; + array TeleportLine = new array; + array TeleportLineCut = new array; + array TeleportPositions = new array; + float X, Y; + while ( FGets( file, line ) > 0 ) + { + TeleportLineCut.Clear(); + TeleportPositions.Clear(); + line.Split(" = ", TeleportLineCut); + int len = TeleportLineCut[1].LengthUtf8(); + len = len - 2; + string LocationPosPreNew = TeleportLineCut[1].Substring(2, len); + LocationPosPreNew.Split(" ", TeleportPositions); + X = TeleportPositions[0].ToFloat(); + Y = TeleportPositions[2].ToFloat(); + + LocationPosNew = Vector(X, 0.0, Y); + LocationNameNew = TeleportLineCut[0]; + + NewTeleport(LocationNameNew, LocationPosNew); + + } + CloseFile(file); + } + } + + void NewTeleport(string name, vector loc) + { + ref FileTeleport nChild = NULL; + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( name == Children[i].LocationName ) + { + nChild = Children[i]; + break; + } + + } + if ( nChild == NULL ) + { + nChild = new FileTeleport( name, this, loc); + Children.Insert( nChild ); + } + } + + void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) + { + if(ok) + { + int ListCount = 0; + PlayerBase Admin; + //PlayerIdentity AdminIdentity; + + switch(rpc_type) + { + case M_RPCs.M_Admin_Menu_Teleport_Write: + //Param1 stringParam; + string PosName; + vector AdminPos; + ctx.Read(PosName); + ctx.Read(AdminPos); + Print(""); + Print("Adding Pos"); + Print(PosName); + Print(AdminPos); + for ( int i = 0; i < Children.Count(); i++ ) + { + if ( PosName == Children[i].LocationName ) + { + return; + } + } + //PosName = stringParam.param1; + if ( GetGame().IsServer() ) + { + vector PosOut; + PosOut = Vector(AdminPos[0], 0.0, AdminPos[2]); + string stringout = PosOut.ToString(false); + AddToFile(PosName, stringout); + Load(); + } + break; + + + } + } + } + +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Tp_Locations/TeleportData.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Tp_Locations/TeleportData.c new file mode 100644 index 0000000..e1c25ae --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/FileHandeling/Tp_Locations/TeleportData.c @@ -0,0 +1,91 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class TeleportData +{ + ref array Locations + string LocationName; + vector LocationPos; + ref FileTeleport Parent; + + void TeleportData(ref FileTeleport parent = NULL) + { + Print("TeleportData"); + + GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); + Parent = parent + } + + + void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) + { + PlayerBase Admin; + switch(rpc_type) + { + // case M_RPCs.M_Admin_Menu_Teleport_RequestData: + // GetFileHandler().LoadTeleport(); + // if ( GetGame().IsServer() ) + // { + // ref array< string > LocationNT = new ref array< string >; + // ref array< vector > LocationP = new ref array< vector >; + // PlayerIdentity AdminIdentity; + // Admin = GetServerMission().IsAdminID(sender.GetName(), sender.GetPlainId()); + // if ( Admin != NULL) + // { + // AdminIdentity = Admin.GetIdentity(); + // for ( int t = 0; t < GetFileHandler().RootTeleport.Children.Count(); t++ ) + // { + ////string name = GetFileHandler().RootTeleport.Children[t].LocationName; + // vector pos = GetFileHandler().RootTeleport.Children[t].LocationPos; + // string name = GetFileHandler().RootTeleport.Children[t].LocationName; + + // LocationNT.Insert(name); + + // LocationP.Insert(pos); + + // } + // Print("Server - Teleport Data Rpc Sent"); + // ScriptRPC TListDst = new ScriptRPC(); + // TListDst.Write(LocationNT); + // TListDst.Write(LocationP); + // TListDst.Send(NULL, M_RPCs.M_Admin_Menu_Teleport_ReciveData, false, AdminIdentity); + // } + // } + + // if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + // { + + // } + // break; + } + } + + +} +ref TeleportData Tomato_TeleportData; + +ref TeleportData GetTeleportData() +{ + if( !Tomato_TeleportData ) + { + Tomato_TeleportData = new ref TeleportData(); + } + + return Tomato_TeleportData; +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/LogSystem/DeathHandler.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/LogSystem/DeathHandler.c new file mode 100644 index 0000000..ed074e9 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/LogSystem/DeathHandler.c @@ -0,0 +1,296 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class DeathHandler +{ + string KillFile = "$profile:\\Dayz-Sa-Tomato\\Log\\Kills.txt"; + + PlayerBase KPlayerBase; + PlayerIdentity KPlayerIdentity; + string KName; + vector KPos; + int Dist; + EntityAI KW; + ItemBase KWItemBase; + string KWName; + + + PlayerBase VPlayerBase; + PlayerIdentity VPlayerIdentity; + string VName; + vector VPos; + + string OutMessage; + + void DeathHandler() + { + + } + + void log(string log) + { + if ( GetGame().IsServer() ) + { + if(FileExist(KillFile)) + { + FileHandle file = OpenFile(KillFile, FileMode.APPEND); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + }else + { + MakeDirectory(KillFile); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + Print("Could not create Folder/File " + KillFile); + } + } + } + + string LineIn() + { + int year, month, day, hour, minute, second; + GetYearMonthDay(year, month, day); + GetHourMinuteSecond(hour, minute, second); + string date = day.ToStringLen(2) + "." + month.ToStringLen(2) + "." + year.ToStringLen(4) + " " + hour.ToStringLen(2) + ":" + minute.ToStringLen(2); + string LineIn = "[" + date + "] - "; + return LineIn; + } + void ConnectHandler(PlayerIdentity player) + { + string msg; + if (GetFileHandler().IsConfig("Welcome_Message")) + { + msg = GetMessage(GetFileHandler().GetConfig("Welcome_Message_Join"), VName); + int count = msg.Replace("{Player}", player.GetName()); + GetGame().ChatPlayer(0, msg); + } + } + void KilledHandler(Object killer, PlayerBase pbKilled) + { + KPlayerBase = NULL; + // Victim + VPlayerBase = PlayerBase.Cast(pbKilled); + VPlayerIdentity = VPlayerBase.GetIdentity(); + VName = VPlayerIdentity.GetName(); + + OutMessage = ""; + + IsMan(killer); + SelectKillType(); + IsAnimal(killer); + Send(); + + } + + void Send() + { + if (OutMessage != "") + { + GetGame().ChatPlayer(0, OutMessage); + } + } + + void IsAnimal(Object killer) + { + if (killer.IsKindOf("AnimalBase")) + { + if (GetFileHandler().IsConfig("KillFeed_Message_Animal")) + { + OutMessage = GetMessage(GetFileHandler().GetConfig("KillFeed_Animal"), VName); + } + } + else if (killer.IsKindOf("ZombieBase")) + { + if (GetFileHandler().IsConfig("KillFeed_Message_Zombie")) //TODO + { + OutMessage = GetMessage(GetFileHandler().GetConfig("KillFeed_Zombie"), VName); + } + } + else + { + if (GetFileHandler().IsConfig("KillFeed_Message_Unknown")) + { + OutMessage = GetMessage(GetFileHandler().GetConfig("KillFeed_Unknown"), VName); + } + } + + } + + void SelectKillType() + { + if (KPlayerBase) + { + if (VPlayerBase == KPlayerBase) + { + if (GetFileHandler().IsConfig("KillFeed_Message_Suicide")) + { + OutMessage = GetMessage(GetFileHandler().GetConfig("KillFeed_Suicide"), VName); + } + + } + else + { + + KPlayerIdentity = NULL; + KPlayerIdentity = KPlayerBase.GetIdentity(); + KName = KPlayerIdentity.GetName(); + KPos = KPlayerBase.GetPosition(); + VPos = VPlayerBase.GetPosition(); + Dist = vector.Distance(VPos, KPos); + KW = KPlayerBase.GetHumanInventory().GetEntityInHands(); + + if (KW.IsItemBase()) + { + KWItemBase = ItemBase.Cast(KW); + KWName = KWItemBase.GetDisplayName(); + + if (KPlayerBase.GetDisplayName() == KWName) + { + if(GetFileHandler().IsConfig("KillFeed_LogToFile")) + { + string Lmessage = GetMessage(GetFileHandler().GetConfig("KillFeed_ByPlayerHand"), VName, KName) + log(Lmessage); + } + + if (GetFileHandler().IsConfig("KillFeed_Message_PlayerHand")) + { + OutMessage = GetMessage(GetFileHandler().GetConfig("KillFeed_ByPlayerHand"), VName, KName); + } + + } + else + { + if(GetFileHandler().IsConfig("KillFeed_LogToFile")) + { + Lmessage = GetMessage(GetFileHandler().GetConfig("KillFeed_ByPlayerWeapon"), VName, KName, KWName, Dist.ToString()) + log(Lmessage); + } + + if (GetFileHandler().IsConfig("KillFeed_Message_PlayerWeapon") + { + OutMessage = GetMessage(GetFileHandler().GetConfig("KillFeed_ByPlayerWeapon"), VName, KName, KWName, Dist.ToString()); + } + + + } + } + else + { + } + } + } + } + + + void IsMan(Object killer) + { + if (killer.IsMan()) + { + if (killer.IsKindOf("SurvivorBase")) + { + KPlayerBase = PlayerBase.Cast(killer); + } + } + else + { + + if (killer.IsItemBase()) + { + KWItemBase = ItemBase.Cast(killer); + KPlayerBase = PlayerBase.Cast(KWItemBase.GetHierarchyRootPlayer()); + } + } + } + + void KilledHandlerOld(Object killer, PlayerBase pbKilled) + { + string Killername; + string Killedname; + SurvivorBase sbKilled = SurvivorBase.Cast(pbKilled); + if (killer.IsMan()) { + + Man manKiller = Man.Cast(killer); + + if (sbKilled.GetPFullName() == manKiller.GetIdentity().GetName()) { + + string KilledBySuicide = GetFileHandler().GetConfig("KillFeed_Suicide"); + Killedname = sbKilled.GetPFullName(); + GetGame().ChatPlayer( 0, GetMessage(KilledBySuicide, Killedname)); + // TL.all(GetMessage(KilledBySuicide, Killedname)); + // TL.all(sbKilled.GetPFullName() + " took his own life"); + + } else + { + SurvivorBase sbKiller = SurvivorBase.Cast(killer); + string KilledByPlayer = GetFileHandler().GetConfig("KillFeed_ByPlayer"); + Killername = sbKiller.GetPFullName(); + Killedname = sbKilled.GetPFullName(); + GetGame().ChatPlayer( 0, GetMessage(KilledByPlayer, Killedname , Killername)); + // TL.all(GetMessage(KilledByPlayer, Killedname, Killername)); + } + } else + { + string KilledByBleed = GetFileHandler().GetConfig("KillFeed_Bleeding_Zombie"); + Killedname = sbKilled.GetPFullName(); + GetGame().ChatPlayer( 0, GetMessage(KilledByBleed, Killedname)); + // TL.all(GetMessage(KilledByBleed, Killedname)); + } + } + + string GetMessage(string input, string killed, string killer = "" , string weap = "", string dist = "") + { + int count = input.Replace("{Killed}", killed); + if(killer != "") + { + count = input.Replace("{Killer}", killer); + } + + if(weap != "") + { + count = input.Replace("{Weapon}", weap); + } + + if(dist != "") + { + count = input.Replace("{Distance}", dist); + } + + + return input; + } + +} + +// ref DeathHandler Tomato_DeathHandler; + +// ref DeathHandler GetDeathHandler() +// { + // if( !Tomato_DeathHandler ) + // { + // Tomato_DeathHandler = new ref DeathHandler(); + // } + + // return Tomato_DeathHandler; +// } \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/LogSystem/LogHandler.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/LogSystem/LogHandler.c new file mode 100644 index 0000000..4856ad8 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/LogSystem/LogHandler.c @@ -0,0 +1,435 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ + +class LogHandler +{ + string LogFolderPath = GetFileHandler().LogFolderPath; + + + string LineIn() + { + int year, month, day, hour, minute, second; + GetYearMonthDay(year, month, day); + GetHourMinuteSecond(hour, minute, second); + string date = day.ToStringLen(2) + "." + month.ToStringLen(2) + "." + year.ToStringLen(4) + " " + hour.ToStringLen(2) + ":" + minute.ToStringLen(2); + string LineIn = "[" + date + "] - "; + return LineIn; + } + + + void LogHandler() + { + GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); + } + + ref PlayerBase GetPlayerBaseByName(string name) + { + + array players = new array; + + PlayerBase selectedPlayer; + PlayerIdentity selectedIdentity; + + GetGame().GetPlayers( players ); + for ( int a = 0; a < players.Count(); ++a ) + { + selectedPlayer = PlayerBase.Cast(players.Get(a)); + selectedIdentity = selectedPlayer.GetIdentity(); + if ( selectedIdentity.GetName() == name ) + { + return selectedPlayer; + } + } + return selectedPlayer; + } + + ref PlayerIdentity GetIdent(string name) + { + + array players = new array; + + PlayerBase selectedPlayer; + PlayerIdentity selectedIdentity; + + GetGame().GetPlayers( players ); + for ( int a = 0; a < players.Count(); ++a ) + { + selectedPlayer = PlayerBase.Cast(players.Get(a)); + selectedIdentity = selectedPlayer.GetIdentity(); + if ( selectedIdentity.GetName() == name ) + { + return selectedIdentity; + } + } + return selectedIdentity; + } + + void status(PlayerIdentity ident, string msg) + { + GetGame().RPCSingleParam( NULL, M_RPCs.M_Admin_Menu_MessageStatus, new Param1( msg ), false, ident ); + } + + void playern(PlayerIdentity ident, string msg) + { + Param1 Msgparam = new Param1( msg ); + GetGame().RPCSingleParam(NULL , ERPCs.RPC_USER_ACTION_MESSAGE, Msgparam, true, ident); + } + + void player(PlayerIdentity ident, string msg) + { + if ( GetGame().IsServer() ) + { + GetGame().RPCSingleParam(NULL, M_RPCs.M_Admin_Message, new Param1(msg), true, ident); + }else{ + GetGame().GetMission().OnEvent(ChatMessageEventTypeID, new ChatMessageEventParams(0, "", msg, "")); + + } + } + + void playerSetup() + { + if ( GetGame().IsServer() ) + { + + }else{ + GetGame().RPCSingleParam(NULL, M_RPCs.M_Admin_Message_Setup, new Param1(""), true, NULL); + } + } + + void all(string msg) + { + if ( GetGame().IsServer() ) + { + + ref array< Man > allPlayers = new ref array< Man >; + GetGame().GetWorld().GetPlayerList(allPlayers); + foreach( Man man : allPlayers ) + { + PlayerBase playerBase = PlayerBase.Cast(man); + playerBase.RPCSingleParam(ERPCs.RPC_USER_ACTION_MESSAGE, new Param1(msg), false, playerBase.GetIdentity()); + } + }else{ + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(msg); + Rpc.Send(NULL, M_RPCs.M_Admin_Log_all, true, NULL); + } + } + + void allWhite(string msg) + { + if ( GetGame().IsServer() ) + { + + GetGame().ChatPlayer(0, msg); + }else{ + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(msg); + Rpc.Send(NULL, M_RPCs.M_Admin_Log_all_White, true, NULL); + } + } + + + void cons(string log) + { + if ( GetGame().IsServer() ) + { + Debug.Log(log) + }else{ + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(log); + Rpc.Send(NULL, M_RPCs.M_Admin_Log_con, true, NULL); + } + } + + + void dbug(string log) + { + if ( GetGame().IsServer() ) + { + if(FileExist(LogFolderPath)) + { + FileHandle file = OpenFile(LogFolderPath + "Debug.txt", FileMode.APPEND); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + }else + { + MakeDirectory(LogFolderPath); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + Print("Could not create Folder/File " + LogFolderPath + "Debug.txt"); + } + }else + { + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(log); + Rpc.Send(NULL, M_RPCs.M_Admin_Menu_Log_Debug, true, NULL); + } + } + + void kill(string log) + { + if ( GetGame().IsServer() ) + { + if(FileExist(LogFolderPath)) + { + FileHandle file = OpenFile(LogFolderPath + "Kills.txt", FileMode.APPEND); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + }else + { + MakeDirectory(LogFolderPath); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + Print("Could not create Folder/File " + LogFolderPath + "Kills.txt"); + } + }else + { + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(log); + Rpc.Send(NULL, M_RPCs.M_Admin_Menu_Log_Debug, true, NULL); + } + } + + + + + void admin(string log) + { + if ( GetGame().IsServer() ) + { + if(FileExist(LogFolderPath)) + { + FileHandle file = OpenFile(LogFolderPath + "Admin.txt", FileMode.APPEND); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + }else{ + MakeDirectory(LogFolderPath + "Admin.txt"); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + } + }else + { + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(log); + Rpc.Send(NULL, M_RPCs.M_Admin_Menu_Log_Admin, true, NULL); + } + } + + void error(string log) + { + if ( GetGame().IsServer() ) + { + if(FileExist(LogFolderPath)) + { + FileHandle file = OpenFile(LogFolderPath + "Error.txt", FileMode.APPEND); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + }else{ + MakeDirectory(LogFolderPath + "Error.txt"); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + Print("Could not create Folder/File " + LogFolderPath + "Error.txt"); + } + }else + { + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(log); + Rpc.Send(NULL, M_RPCs.M_Admin_Log_error, true, NULL); + } + } + + void info(string log) + { + if ( GetGame().IsServer() ) + { + if(FileExist(LogFolderPath)) + { + FileHandle file = OpenFile(LogFolderPath + "Info.txt", FileMode.APPEND); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + }else{ + MakeDirectory(LogFolderPath + "Info.txt"); + if (file != 0) + { + FPrintln(file, LineIn() + log); + CloseFile(file); + } + Print("Could not create Folder/File " + LogFolderPath + "Info.txt"); + } + }else + { + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(log); + Rpc.Send(NULL, M_RPCs.M_Admin_Log_info, true, NULL); + } + } + + void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) + { + string msg; + string player; + switch(rpc_type) + { + case M_RPCs.M_Admin_Message: + Param1< string > specParams; + ctx.Read( specParams ); + if ( GetGame().IsClient() ) + { + player(sender, specParams.param1); + } + + break; + + case M_RPCs.M_Admin_Message_Setup: + //ctx.Read( specParams ); + if ( GetGame().IsServer() ) + { + if(GetFileHandler().IsConfig("Setup")) + { + if(GetFileHandler().HasPermission("Admin", sender)) + { + player(sender, "Admin Set Menu Should open !") + }else{ + player(sender,"Admin not set type /opme and try again") + } + } + + } + + break; + + case M_RPCs.M_Admin_Log_info: + ctx.Read( msg ); + if ( GetGame().IsServer() ) + { + if(GetFileHandler().HasPermission("Admin", sender)) + { + info(msg); + } + } + break; + + case M_RPCs.M_Admin_Log_error: + ctx.Read( msg ); + if ( GetGame().IsServer() ) + { + if(GetFileHandler().HasPermission("Admin", sender)) + { + error(msg); + } + } + break; + + case M_RPCs.M_Admin_Menu_Log_Admin: + ctx.Read( msg ); + if ( GetGame().IsServer() ) + { + if(GetFileHandler().HasPermission("Admin", sender)) + { + admin(msg); + } + } + break; + + case M_RPCs.M_Admin_Menu_Log_Debug: + ctx.Read( msg ); + if ( GetGame().IsServer() ) + { + if(GetFileHandler().HasPermission("Admin", sender)) + { + dbug(msg); + } + } + break; + + case M_RPCs.M_Admin_Log_con: + ctx.Read( msg ); + if ( GetGame().IsServer() ) + { + if(GetFileHandler().HasPermission("Admin", sender)) + { + cons(msg); + } + } + break; + + case M_RPCs.M_Admin_Log_all: + ctx.Read( msg ); + if ( GetGame().IsServer() ) + { + if(GetFileHandler().HasPermission("Admin", sender)) + { + all(msg); + } + } + break; + + case M_RPCs.M_Admin_Log_all_White: + ctx.Read( msg ); + if ( GetGame().IsServer() ) + { + if(GetFileHandler().HasPermission("Admin", sender)) + { + allWhite(msg); + } + } + break; + } + } +} + +ref LogHandler Tomato_LogHandler; + +ref LogHandler TL() +{ + if( !Tomato_LogHandler ) + { + Tomato_LogHandler = new ref LogHandler(); + } + + return Tomato_LogHandler; +} \ No newline at end of file diff --git a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_RPCs.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/M_RPCs.c similarity index 60% rename from DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_RPCs.c rename to Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/M_RPCs.c index 5fdfb92..878795c 100644 --- a/DayZ-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/M_RPCs.c +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/M_RPCs.c @@ -1,4 +1,4 @@ -/* + /* DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de Copyright (C) 2018 DayZ-SA-Tomato @@ -58,10 +58,54 @@ enum M_RPCs M_Admin_Menu_Player_List_Request = 7036; M_Admin_Menu_Player_List = 7037; M_Admin_Menu_Log_Debug = 7038; - M_Admin_Menu_Log_Startup = 7039; + M_Admin_Menu_Log_Admin = 7039; M_Admin_Menu_Log_RPC = 7040; M_Admin_Menu_Message = 7041; M_Admin_Menu_Teleport_List_Request = 7042; M_Admin_Menu_Teleport_List = 7043; M_Admin_Menu_TpMeToPos = 7044; + M_Admin_Menu_TpMeToPosVec = 7045; + M_Admin_Menu_Player_List_Clear = 7046; + M_Admin_Menu_Teleport_RequestData = 7047; + M_Admin_Menu_Teleport_ReciveData = 7048; + M_Admin_Menu_Teleport_Write = 7049; + M_Admin_Player_UpdatePlayers = 7050; + M_Admin_Player_RemovePlayer = 7051; + M_Admin_Player_UpdatePlayer = 7052; + M_Admin_Player_SetHealth = 7053; + M_Admin_Player_SetBlood = 7054; + M_Admin_Player_SetEnergy = 7055; + M_Admin_Player_SetWater = 7056; + M_Admin_Player_SetShock = 7057; + M_Admin_Player_SetHeatComfort = 7058; + M_Admin_Player_SetWet = 7059; + M_Admin_Player_SetTremor = 7060; + M_Admin_Player_SetStamina = 7061; + M_Admin_Player_SetLifeSpanState = 7062; + M_Admin_Player_SetBloodyHands = 7063; + M_Admin_Player_KickTransport = 7064; + M_Admin_Player_RepairTransport = 7065; + M_Admin_Player_TeleportToMe = 7066; + M_Admin_Player_TeleportMeTo = 7067; + M_Admin_SpectatePlayer = 7068; + M_Admin_Player_GodMode = 7069; + M_Admin_SetConfigs = 7070; + M_Admin_KickPlayer = 7071; + M_Admin_BanPlayer = 7072; + M_Admin_Log_con = 7073; + M_Admin_Log_all = 7074; + M_Admin_Log_all_White = 7075; + M_Admin_Log_error = 7076; + M_Admin_Log_info = 7077; + M_Admin_Log_player = 7078; + M_Admin_Delete_Object = 7079; + M_SET_CAM_Spectate = 7080; + M_Admin_Horde = 7081; + M_Admin_Message = 7082; + M_Admin_Message_Setup = 7083; + M_Admin_Menu_MessageBox = 7084; + M_Admin_Menu_MessageStatus = 7085; + M_Admin_Menu_Teleport_Write_Pre = 7086; + + } diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/EmoteManager.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/EmoteManager.c new file mode 100644 index 0000000..52bb843 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/EmoteManager.c @@ -0,0 +1,28 @@ + + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +modded class EmoteManager +{ + override void LogSuicide() + { + m_Player.issic(true); + super.LogSuicide(); + } +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/PlayerBase.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/PlayerBase.c new file mode 100644 index 0000000..3c60f47 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/PlayerBase.c @@ -0,0 +1,84 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +modded class PlayerBase +{ + ref FPPlayer authentiPlayer; + + ref DeathHandler m_DeathHandler; + + override void OnConnect() + { + m_DeathHandler = new ref DeathHandler; + // TL().cons("Player connected: " + this.ToString()); + ref SurvivorBase m_SurBase = SurvivorBase.Cast(this); + m_SurBase.SetPID(this.GetIdentity().GetPlainId()); + m_SurBase.SetPFullName(this.GetIdentity().GetName()); + + // NEW STATS API + // StatRegister("playtime"); + // StatRegister("dist"); + + Debug.Log("Player connected:"+this.ToString(),"Connect"); + m_DeathHandler.ConnectHandler(this.GetIdentity()); + // NEW STATS API + StatRegister("playtime"); + StatRegister("dist"); + + m_PlayerOldPos = GetPosition(); + if( m_AnalyticsTimer ) + m_AnalyticsTimer.Run( 60, this, "UpdatePlayerMeasures", null, true ); + + } + override void EEKilled( Object killer ) + { + PlayerBase Killer_Playerbase; // Killer PlayerBase + m_DeathHandler.KilledHandler(killer, this); + + if( GetBleedingManagerServer() ) delete GetBleedingManagerServer(); + + + + // kill character in database + if (GetHive()) + { + GetHive().CharacterKill(this); + } + + // disable voice communication + GetGame().EnableVoN(this, false); + + + + GetSymptomManager().OnPlayerKilled(); + + super.EEKilled(killer); + } + + bool selfkill = false; + void issic(bool Yep) + { + selfkill = Yep; + } + + bool CanBeDeleted() + { + return IsAlive() && !IsRestrained() && !IsUnconscious(); + } +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/SurvivorBase.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/SurvivorBase.c new file mode 100644 index 0000000..b6e5a62 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/ModdedClasses/SurvivorBase.c @@ -0,0 +1,45 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ + +modded class SurvivorBase +{ + private string PID = "empty"; + private string PFullName = "empty"; + + string GetPID() + { + return PID; + } + + void SetPID(string IdentityID) + { + PID = IdentityID; + } + + string GetPFullName() + { + return PFullName; + } + + void SetPFullName(string name) + { + PFullName = name; + } +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/Modules/FileHandler.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/Modules/FileHandler.c new file mode 100644 index 0000000..da04162 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/4_World/Modules/FileHandler.c @@ -0,0 +1,482 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class FileHandler +{ + //Main Folder + string MainFolder = "$profile:\\Tomato_Profiles"; + string MainFolderPath = "$profile:\\Tomato_Profiles\\"; + //Config Folder and Files + string ConfigFolder = MainFolderPath + "Config"; + string ConfigFolderPath = MainFolderPath + "Config\\"; + string ConfigFile = ConfigFolderPath + "Config.txt"; + //Players Folder + string PlayersFolderPath = ConfigFolderPath + "Players\\"; + //Log Folder and Files + string LogFolder = MainFolderPath + "Log"; + string LogFolderPath = MainFolderPath + "Log\\"; + string LErrorFile = LogFolderPath + "Error.txt"; + string LDebugFile = LogFolderPath + "Debug.txt"; + string LInfoFile = LogFolderPath + "Info.txt"; + string LAdminFile = LogFolderPath + "Admin.txt"; + string LKillsFile = LogFolderPath + "Kills.txt"; + //Customization Folder and Files + string CustomizationFolder = MainFolderPath + "Customization"; + string CustomizationFolderPath = MainFolderPath + "Customization\\"; + string TeleportFile = CustomizationFolderPath + "Teleport_Locations.txt"; + bool IsExit = false; + ref FileConfig RootConfig; + ref FileTeleport RootTeleport; + //ref FilePlayers RootPlayers; + + // NEW BEGINN + ref array< ref FPPlayer > FPPlayers; + ref FPPermission RootPermission; + // NEW END + + + + + void FileHandler() + { + RootConfig = new ref FileConfig( "ROOT" ); + RootTeleport = new ref FileTeleport( "ROOT" ); + //RootPlayers = new ref FilePlayers( "ROOT" ); + + // NEW BEGINN + FPPlayers = new ref array< ref FPPlayer >; + RootPermission = new ref FPPermission( "ROOT" ); + // NEW END + + } + + // NEW BEGINN + + void SetPermission(string perm, PermissionType type, string id) //Identity.GetID() + { + Print("FileHandler"); + for ( int i = 0; i < FPPlayers.Count(); i++ ) + { + if ( FPPlayers[i].GetGUID() == id ) + { + Print("FileHanddler Player Founf"); + FPPlayers[i].SetPermission(perm , type); + //return FPPlayers[i].HasPermission( fPPermission ); + } + } + } + + array< ref FPPlayer > GetPlayers( ref array< string > guids = NULL ) + { + if ( guids == NULL ) + { + return FPPlayers; + } + + array< ref FPPlayer > tempArray = new array< ref FPPlayer >; + + for ( int i = 0; i < guids.Count(); i++ ) + { + for ( int k = 0; k < FPPlayers.Count(); k++ ) + { + if ( guids[i] == FPPlayers[k].GetGUID() ) + { + tempArray.Insert( FPPlayers[k] ); + } + } + } + + return tempArray; + } + + void SetPlayers( ref array< ref FPPlayer > players ) + { + FPPlayers.Clear(); + + // This doesn't work??? wtf + //FPPlayers.Copy( players ); + + for ( int i = 0; i < players.Count(); i++ ) + { + FPPlayers.Insert( players[i] ); + } + } + + void AddPlayers( ref array< ref FPPlayer > players ) + { + for ( int i = 0; i < players.Count(); i++ ) + { + FPPlayers.Insert( players[i] ); + } + } + + void RegisterPermission( string fPPermission, PermissionType type = PermissionType.DISALLOW ) + { + RootPermission.AddPermission( fPPermission, type ); + } + + ref array< string > ToPermArray() + { + ref array< string > data = new ref array< string >; + RootPermission.ToPermArray( data ); + return data; + } + + ref FPPermission GetRootPermission() + { + return RootPermission; + } + + bool HasPermission( string fPPermission, PlayerIdentity player = NULL ) + { + if ( !GetGame().IsMultiplayer() ) return true; + + if ( player == NULL ) + { + if ( ClientAuthPlayer == NULL ) + { + return true; + } + + return ClientAuthPlayer.HasPermission( fPPermission ); + } + + for ( int i = 0; i < FPPlayers.Count(); i++ ) + { + if ( FPPlayers[i].GetGUID() == player.GetId() ) + { + return FPPlayers[i].HasPermission( fPPermission ); + } + } + + return false; + } + + ref FPPlayer PlayerJoined( PlayerIdentity player ) + { + ref PlayerDataN data = new ref PlayerDataN; + + if ( player ) + { + data.SName = player.GetName(); + data.SGUID = player.GetId(); + data.SSteam64ID = player.GetPlainId(); + } else + { + data.SName = "Offline Mode"; + data.SGUID = "N/A"; + } + + ref FPPlayer auPlayer = new ref FPPlayer( data ); + + auPlayer.IdentityPlayer = player; + + auPlayer.CopyPermissions( RootPermission ); + + auPlayer.Load(); + + FPPlayers.Insert( auPlayer ); + + return auPlayer; + } + + void PlayerLeft( PlayerIdentity player ) + { + ref PlayerDataN PData = new ref PlayerDataN; + if ( player == NULL ) return; + + for ( int i = 0; i < FPPlayers.Count(); i++ ) + { + ref FPPlayer auPlayer = FPPlayers[i]; + + if ( auPlayer.GetSteam64ID() == player.GetPlainId() ) + { + auPlayer.Save(); + + if ( GetGame().IsServer() && GetGame().IsMultiplayer() ) + { + PData = SerializePlayer( auPlayer ); + ScriptRPC Adding = new ScriptRPC(); + Adding.Write(PData); + Adding.Send(NULL, M_RPCs.M_Admin_Player_RemovePlayer, true, NULL); + //GetRPCManager().SendRPC( "PermissionsFramework", "RemovePlayer", new Param1< ref PlayerDataN >( SerializePlayer( auPlayer ) ), true ); + } + + FPPlayers.Remove( i ); + break; + } + } + } + + // void DebugPrint() + // { + // Print( "Printing all authenticated players!" ); + // for ( int i = 0; i < FPPlayers.Count(); i++ ) + // { + // FPPlayers[i].DebugPrint(); + // } + // } + + ref FPPlayer GetPlayerByGUID( string guid ) + { + ref FPPlayer auPlayer = NULL; + + for ( int i = 0; i < FPPlayers.Count(); i++ ) + { + if ( FPPlayers[i].GetGUID() == guid ) + { + auPlayer = FPPlayers[i]; + break; + } + } + + if ( auPlayer == NULL ) + { + ref PlayerDataN data = new ref PlayerDataN; + + data.SGUID = guid; + + auPlayer = new ref FPPlayer( data ); + + FPPlayers.Insert( auPlayer ); + } + + return auPlayer; + } + + ref FPPlayer GetPlayerByIdentity( PlayerIdentity ident ) + { + if ( ident == NULL ) return NULL; + + ref FPPlayer auPlayer = NULL; + + for ( int i = 0; i < FPPlayers.Count(); i++ ) + { + if ( FPPlayers[i].GetGUID() == ident.GetId() ) + { + auPlayer = FPPlayers[i]; + break; + } + } + + if ( auPlayer == NULL ) + { + auPlayer = PlayerJoined( ident ); + } + + return auPlayer + } + + ref FPPlayer GetPlayer( ref PlayerDataN data ) + { + if ( data == NULL ) return NULL; + + ref FPPlayer auPlayer = NULL; + + for ( int i = 0; i < FPPlayers.Count(); i++ ) + { + if ( FPPlayers[i].GetGUID() == data.SGUID ) + { + auPlayer = FPPlayers[i]; + break; + } + } + + if ( auPlayer == NULL ) + { + auPlayer = new ref FPPlayer( data ); + + FPPlayers.Insert( auPlayer ); + } + + auPlayer.NewData( data ); + + auPlayer.ToPermData(); + + return auPlayer; + } + + // NEW END + void AddLocation(string PosName, vector AdminPos) + { + RootTeleport.AddNewLocation(PosName, AdminPos) + } + void LoadTeleport() + { + RootTeleport.Load(); + } + + void RegisterNewconfig( string CfgName , string type, string data = "") + { + Print("RegisterNewconfig Data = " + data) + RootConfig.RegisterNewconfig( CfgName, type , data); + } + + void PrintAllConfigs() + { + RootConfig.PrintAll(); + } + + void ConfigInitialize() + { + RootConfig.ConfigInitialize(); + } + + + bool IsConfig( string CfgName) + { + bool iscfg = false; + iscfg = RootConfig.IsConfig(CfgName); + return iscfg; + } + + string GetConfig( string CfgName) + { + string getConf = ""; + getConf = RootConfig.GetConfigData(CfgName); + return getConf; + } + + void CheckAndCreateFiles() + { + Print("DayZ-Sa-Tomato Checking File system"); + CheckFolder(MainFolder); + CheckFolder(ConfigFolder); + CheckFolder(CustomizationFolder); + CheckFolder(LogFolder); + + CheckFile(LKillsFile); + CheckFile(TeleportFile); + CheckFile(LErrorFile); + CheckFile(LDebugFile); + CheckFile(LInfoFile); + CheckFile(LAdminFile); + } + + + + void CheckFile(string File) + { + if(FileExist(File)) + { + Print("FileHandler : File " + File + " found!"); + }else + { + FileHandle file = OpenFile(File, FileMode.APPEND); + if (file != 0) + { + FPrintln(file, ""); + CloseFile(file); + } + if(FileExist(File)) + { + if(File == TeleportFile) + { + CreateTeleportFile(); + }else + { + Print("FileHandler : File " + File + " Created"); + } + } + } + } + + void SetConfigType(string name, string stype) + { + ConfigType type + if(stype == "true"){type = ConfigType.true;} + else if (stype == "false"){type = ConfigType.false;} + else if (stype == "custom"){type = ConfigType.custom;} + + for ( int i = 0; i < RootConfig.Children.Count(); i++ ) + { + if ( name == RootConfig.Children[i].ConfigName ) + { + RootConfig.Children[i].SetConfigType(type); + } + } + + RootConfig.WriteToFile(); + } + + void SetConfigData(string name, string data) + { + for ( int i = 0; i < RootConfig.Children.Count(); i++ ) + { + if ( name == RootConfig.Children[i].ConfigName ) + { + RootConfig.Children[i].SetConfigData(data); + } + } + RootConfig.WriteToFile(); + } + + void CheckFolder(string Folder) + { + if(FileExist(Folder)) + { + Print("FileHandler : Folder " + Folder + " found!"); + }else + { + MakeDirectory(Folder); + if(FileExist(Folder)) + { + Print("FileHandler : Folder " + Folder + " Created"); + } + } + } + + void CreateTeleportFile() + { + FileHandle file = OpenFile(TeleportFile, FileMode.APPEND); + if (file != 0) + { + FPrintln(file, "Prison Island = 2651.42 0.0 1395.8"); + FPrintln(file, "Mogilevka = 7572.65 0.0 5182.3"); + FPrintln(file, "Stary Sobor = 6192.39 0.0 7666.5"); + FPrintln(file, "Msta = 11206.6 0.0 5398.70"); + FPrintln(file, "Solnichniy = 13436.5 0.0 6158.7"); + FPrintln(file, "Chernogorsk = 6350.99 0.0 2666.12"); + FPrintln(file, "Elektrogorsk = 10432.1 0.0 2218.56"); + FPrintln(file, "Berezino = 12661.4 0.0 9465.03"); + FPrintln(file, "Tisy = 1890.45 0.0 13704.6"); + FPrintln(file, "Gorka = 9678.94 0.0 8828.93"); + FPrintln(file, "Balota = 4546.92 0.0 2416.4"); + FPrintln(file, "Vybor = 3916.85 0.0 8795.59"); + FPrintln(file, "Severograd = 8318.51 0.0 12743.4"); + FPrintln(file, "North West Airfield = 4835.59 0.0 9667.72"); + FPrintln(file, "Green Mountain = 3752.08 0.0 6002.94"); + FPrintln(file, "Zelenogorsk = 2542.18 0.0 4994.26"); + FPrintln(file, "Tisy Military Base = 1599.15 0.0 14166.66"); + FPrintln(file, "Pavlovo Military Base = 2047.82 0.0 3293.36"); + CloseFile(file); + } + } +} +ref FileHandler Tomato_FileHandler; + +ref FileHandler GetFileHandler() +{ + if( !Tomato_FileHandler ) + { + Tomato_FileHandler = new ref FileHandler(); + } + + return Tomato_FileHandler; +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/ChatModule.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/ChatModule.c new file mode 100644 index 0000000..74c59d5 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/ChatModule.c @@ -0,0 +1,143 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +typedef Param4 ChatParams; +class ChatModules +{ + + protected ref map m_Commands; + + void ChatModules() + { + m_Commands = new map; //Command, length + + m_Commands.Insert("/test",1); + m_Commands.Insert("/test1",1); + m_Commands.Insert("/opme",1); + //m_Commands.Insert("/split",7); + } + + void ChatHandler( Param request_info ) + { + ChatParams chat_params = ChatParams.Cast(request_info); + if (chat_params) + { + array players = new array; + GetGame().GetPlayers( players ); + + PlayerBase Admin; + PlayerIdentity AdminIdentity; + string AdminUID; + string AdminName; + + PlayerBase selectedPlayer; + PlayerIdentity selectedIdentity; + string selectedUID; + + string chatLine = chat_params.param3; + string strMessage; + Param1 Msgparam; + + for (int i = 0; i < players.Count(); ++i) + { + if (players.Get(i).GetIdentity().GetName() == chat_params.param2 && GetFileHandler().HasPermission("Admin", players.Get(i).GetIdentity() ) ) + { + Admin = players.Get(i); + AdminIdentity = Admin.GetIdentity(); + AdminUID = AdminIdentity.GetPlainId(); + AdminName = AdminIdentity.GetName(); + }else if(chatLine == "/opme" && GetFileHandler().IsConfig("Setup")) + { + Admin = players.Get(i); + AdminIdentity = Admin.GetIdentity(); + GetFileHandler().SetPermission("Admin", PermissionType.ALLOW, AdminIdentity.GetId()); + GetFileHandler().SetConfigType("Setup", "false"); + //TL().player(AdminIdentity, "Admin Set please relog to save Config !"); + return; + } + } + + if (Admin && AdminUID != "") + { + if (chatLine.Contains("/")) + { + ref array chatData = CheckCommand(chatLine); + string cCommand, cData; + if (chatData != NULL) + { + cCommand = chatData.Get(0); + cData = chatData.Get(1); + } else { cCommand = "UnknownCommand" } + + switch(cCommand) + { + case "/test": + GetAdminMenuManager().MessageOpen(AdminIdentity, "This is a Test Message which is not that short") + TL().player(AdminIdentity, "Message Show") + break; + + case "/test1": + g_Game.GetUIManager().CloseMenu(7001); + TL().player(AdminIdentity, "Message Close") + break; + } + } + } + } + + } + ref array CheckCommand(string CommandLine) + { + ref array ret = new array; + string strRplce,mKey; + int cmdLength; + + strRplce = CommandLine; + + for (int i = 0; i < m_Commands.Count(); ++i) + { + mKey = m_Commands.GetKey(i); + cmdLength = m_Commands.Get(mKey); + + if (CommandLine.Contains(mKey)) + { + strRplce.Replace(mKey + " ",""); + ret.Insert(mKey); //0 = Command 1 = Data + if (strRplce != "") + { + ret.Insert(strRplce); + } + return ret; + } + } + return NULL; +} + +} +ref ChatModules Tomato_ChatModule; + +ref ChatModules GetChatModule() +{ + if( !Tomato_ChatModule ) + { + Tomato_ChatModule = new ref ChatModules(); + } + + return Tomato_ChatModule; +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Config/ConfigModule.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Config/ConfigModule.c new file mode 100644 index 0000000..6559c1e --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Config/ConfigModule.c @@ -0,0 +1,66 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class ConfigModule +{ + void ConfigModule() + { + + } + + void Init() + { + GetFileHandler().CheckAndCreateFiles(); + GetFileHandler().RegisterNewconfig("Setup", "true"); + + //Horde Message + GetFileHandler().RegisterNewconfig("Horde_Message", "true",); + GetFileHandler().RegisterNewconfig("Horde_Message_Location", "custom", "Horde appeared near {Location}"); + + //Welcome Message + GetFileHandler().RegisterNewconfig("Welcome_Message", "false",); + GetFileHandler().RegisterNewconfig("Welcome_Message_Join", "custom", "{Player} just joined the Server"); + + // Kill Feed + GetFileHandler().RegisterNewconfig("KillFeed_LogToFile", "false"); + + GetFileHandler().RegisterNewconfig("KillFeed_Message_Suicide", "false",); + GetFileHandler().RegisterNewconfig("KillFeed_Suicide", "custom", "{Killed} took his own life"); + + GetFileHandler().RegisterNewconfig("KillFeed_Message_PlayerHand", "false",); + GetFileHandler().RegisterNewconfig("KillFeed_ByPlayerHand", "custom", "{Killed} murdered by {Killer} with his Hands"); + + GetFileHandler().RegisterNewconfig("KillFeed_Message_PlayerWeapon", "false",); + GetFileHandler().RegisterNewconfig("KillFeed_ByPlayerWeapon", "custom", "{Killed} murdered by {Killer} with Weapon {Weapon} from {Distance}m"); + + GetFileHandler().RegisterNewconfig("KillFeed_Message_Zombie", "false",); + GetFileHandler().RegisterNewconfig("KillFeed_Zombie", "custom", "{Killed} died by a zombie"); + + GetFileHandler().RegisterNewconfig("KillFeed_Message_Animal", "false",); + GetFileHandler().RegisterNewconfig("KillFeed_Animal", "custom", "{Killed} died by a Wild Animal"); + + GetFileHandler().RegisterNewconfig("KillFeed_Message_Unkown", "false",); + GetFileHandler().RegisterNewconfig("KillFeed_Unknown", "custom", "{Killed} died"); + + GetFileHandler().ConfigInitialize(); + + + } + +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Player/PermissionBase.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Player/PermissionBase.c new file mode 100644 index 0000000..ced711b --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Player/PermissionBase.c @@ -0,0 +1,168 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato, + however this File is Execludet from GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 since it is + + Originally from DayZ-CommunityOnlineTools + Link : https://github.com/Jacob-Mango/DayZ-CommunityOnlineTools + Created by Jacob-Mango + and Published under license (CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ + which means this file is under CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ Licence. + */ +class PermissionBase +{ + protected ref array< Man > bServerPlayers; + + protected bool bLoaded; + protected ref array< PlayerIdentity > bServerIdentities; + void PermissionBase() + { + GetFileHandler().IsExit = false + if ( GetGame().IsServer() && GetGame().IsMultiplayer() ) + { + bServerPlayers = new ref array< Man >; + } + bServerIdentities = new ref array< PlayerIdentity >; + bLoaded = false; + GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); + } + + void ~PermissionBase() + { + Print("PermissionBase::~PermissionBase"); + if ( GetGame().IsServer() && GetGame().IsMultiplayer() ) + { + GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).Remove( this.ReloadPlayerList ); + GetFileHandler().IsExit = true; + delete bServerPlayers; + } + } + + private bool CheckIfExists( ref FPPlayer auPlayer ) + { + for ( int i = 0; i < bServerIdentities.Count(); i++ ) + { + if ( auPlayer.GetGUID() == bServerIdentities[i].GetId() ) + { + return true; + } + } + + return false; + } + + void OnStart() + { + if ( GetGame().IsServer() && GetGame().IsMultiplayer() ) + { + GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( this.ReloadPlayerList, 1000, true ); + } + } + + void OnFinish() + { + GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).Remove( this.ReloadPlayerList ); + } + + void OnLoaded() + { + } + + void Update( float timeslice ) + { + if( !bLoaded && !GetDayZGame().IsLoading() ) + { + bLoaded = true; + OnLoaded(); + } else { + OnUpdate( timeslice ); + } + } + + void OnUpdate( float timeslice ) + { + ReloadPlayerList(); + } + + void ReloadPlayerList() + { + if(GetFileHandler().IsExit){return;} + GetGame().GetPlayers( bServerPlayers ); + if(GetFileHandler().IsExit){return;} + for ( int i = 0; i < bServerPlayers.Count(); i++ ) + { + if(GetFileHandler().GetFileHandler().IsExit){return;} + Man man = bServerPlayers[i]; + PlayerBase player = PlayerBase.Cast( man ); + if(GetFileHandler().IsExit){return;} + ref FPPlayer auPlayer = GetFileHandler().GetPlayerByIdentity( man.GetIdentity() ); + + if ( player ) + { + if(GetFileHandler().IsExit){return;} + player.authentiPlayer = auPlayer; + } + if(GetFileHandler().IsExit){return;} + auPlayer.PlayerObject = player; + auPlayer.IdentityPlayer = man.GetIdentity(); + if(GetFileHandler().IsExit){return;} + auPlayer.UpdatePlayerDataN(); + } + if(GetFileHandler().IsExit){return;} + bServerPlayers.Clear(); + + } + + + void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) + { + + PlayerBase Admin; + PlayerIdentity AdminIdentity; + ref PlayerDataN PData = new ref PlayerDataN; + switch(rpc_type) + { + case M_RPCs.M_Admin_Player_UpdatePlayers: + if ( GetGame().IsServer() ) + { + Admin = GetServerMission().IsAdminID(sender.GetName(), sender); + if ( Admin != NULL) + { + AdminIdentity = Admin.GetIdentity(); + + for ( int i = 0; i < GetFileHandler().GetPlayers().Count(); i++ ) + { + PData = SerializePlayer( GetFileHandler().GetPlayers().Get( i ) ); + ScriptRPC Adding = new ScriptRPC(); + Adding.Write(PData); + Adding.Send(NULL, M_RPCs.M_Admin_Player_UpdatePlayer, true, sender); + //GetRPCManager().SendRPC( "PermissionBase", "UpdatePlayer", new Param1< ref PlayerDataN >( SerializePlayer( GetFileHandler().GetPlayers().Get( i ) ) ), true, sender ); + } + } + } + break; + + case M_RPCs.M_Admin_Player_RemovePlayer: + if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + { + ctx.Read(PData); + GetFileHandler().FPPlayers.RemoveItem( DeserializePlayer( PData ) ); + } + break; + + case M_RPCs.M_Admin_Player_UpdatePlayer: + if ( GetGame().IsClient() && GetGame().IsMultiplayer() ) + { + ctx.Read(PData); + DeserializePlayer( PData ); + } + break; + + + } + + } +} diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Player/PlayerModule.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Player/PlayerModule.c new file mode 100644 index 0000000..afa7e7b --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Player/PlayerModule.c @@ -0,0 +1,591 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato, + however this File is Execludet from GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 since it is + + Originally from DayZ-CommunityOnlineTools + Link : https://github.com/Jacob-Mango/DayZ-CommunityOnlineTools + Created by Jacob-Mango + and Published under license (CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ + which means this file is under CC BY SA 4.0) http://creativecommons.org/licenses/by-sa/4.0/ Licence. + */ +class PlayerModule +{ + + void PlayerModule() + { + Print("PlayerModule Init"); + // FileHandler().RegisterPlayerConfig( "Menu.Admin" ); + + GetFileHandler().RegisterPermission( "Admin" ); + GetFileHandler().RegisterPermission( "DisableStamina" ); + GetFileHandler().RegisterPermission( "Godmode" ); + + //GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); + } + + void ~PlayerModule() + { + } + + + void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) + { + PlayerBase Admin; + PlayerIdentity AdminIdentity; + float Dfloat; + bool Dbool; + vector Dvector; + ref array Dstring = new ref array ; + ref array Dstring1 = new ref array ; + switch(rpc_type) + { + case M_RPCs.M_Admin_Player_SetHealth: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + array< ref FPPlayer > players = DeserializePlayersGUID( Dstring ); + + for (int i = 0; i < players.Count(); i++ ) + { + PlayerBase player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.SetHealth( "GlobalHealth", "Health", Dfloat ); + + //COTLog( sender, "Set health to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetBlood: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.SetHealth( "GlobalHealth", "Blood", Dfloat ); + + //COTLog( sender, "Set blood to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetEnergy: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.GetStatEnergy().Set( Dfloat ); + + //COTLog( sender, "Set energy to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetWater: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.GetStatWater().Set( Dfloat ); + + //COTLog( sender, "Set water to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetShock: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.SetHealth( "GlobalHealth", "Shock", Dfloat ); + + //COTLog( sender, "Set shock to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetWet: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.GetStatWet().Set( Dfloat ); + + //COTLog( sender, "Set wetness to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetShock: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.GetStatHeatComfort().Set( Dfloat ); + + //COTLog( sender, "Set heat comfort to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetStamina: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.GetStatStamina().Set( Dfloat ); + + //COTLog( sender, "Set stamina to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetHeatComfort: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.GetStatTremor().Set( Dfloat ); + + //COTLog( sender, "Set tremor to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetLifeSpanState: + ctx.Read(Dfloat); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + if ( Dfloat >= LifeSpanState.BEARD_NONE && Dfloat < LifeSpanState.COUNT ) + { + player.SetLifeSpanStateVisible( Dfloat ); + } + + //COTLog( sender, "Set beard state to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_SetBloodyHands: + ctx.Read(Dbool); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + player.SetBloodyHands( Dfloat ); + + //COTLog( sender, "Set bloody hands to " + Dfloat + " for " + players[i].GetGUID() ); + } + } + break; + + case M_RPCs.M_Admin_Player_KickTransport: + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + HumanCommandVehicle vehCommand = player.GetCommand_Vehicle(); + + if ( vehCommand == NULL ) continue; + + Transport trans = vehCommand.GetTransport(); + + if ( trans ) + { + Car caro; + if ( Class.CastTo(caro, trans) ) + { + float speed = caro.GetSpeedometer(); + if ( speed <= 8 ) + { + vehCommand.GetOutVehicle(); + } + else + { + vehCommand.JumpOutVehicle(); + } + + //COTLog( sender, "Kicked " + players[i].GetGUID() + " out of transport" ); + } + } + } + } + break; + + case M_RPCs.M_Admin_Player_RepairTransport: + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + array< Transport > completedTransports = new array< Transport >; + + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL || player.GetTransport() == NULL ) continue; + + Transport transport = player.GetTransport(); + + if ( completedTransports.Find( transport ) > -1 ) + { + ItemBase radiator; + + Class.CastTo( radiator, transport.FindAttachmentBySlotName("CarRadiator") ); + + if ( radiator ) + { + radiator.SetHealth( "", "", 1 ); + } + + transport.SetHealth( "Engine", "", 1 ); + transport.SetHealth( "FuelTank", "", 1 ); + + CarScript car = CarScript.Cast( transport ); + + if ( car ) + { + car.Fill( CarFluid.FUEL, car.GetFluidCapacity( CarFluid.FUEL ) ); + car.Fill( CarFluid.OIL, car.GetFluidCapacity( CarFluid.OIL ) ); + car.Fill( CarFluid.BRAKE, car.GetFluidCapacity( CarFluid.BRAKE ) ); + car.Fill( CarFluid.COOLANT, car.GetFluidCapacity( CarFluid.COOLANT ) ); + } + + completedTransports.Insert( transport ); + + //COTLog( sender, "Repaired transport for " + players[i].GetGUID() ); + } + } + } + break; + + case M_RPCs.M_Admin_Player_TeleportToMe: + ctx.Read(Dvector); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < players.Count(); i++ ) + { + player = players[i].PlayerObject; + + if ( player == NULL ) continue; + + if ( player.GetTransport() != NULL ) continue; + + player.SetPosition( Dvector ); + + //COTLog( sender, "Teleported " + players[i].GetGUID() + " to self" ); + } + } + break; + + case M_RPCs.M_Admin_Player_TeleportMeTo: + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + PlayerBase senderPlayer = PlayerBase.Cast( target ); + + if ( senderPlayer == NULL || senderPlayer.GetTransport() != NULL ) return; + + + players = DeserializePlayersGUID( Dstring ); + + if ( players.Count() != 1 ) return; + + player = players[0].PlayerObject; + + if ( player == NULL ) return; + + senderPlayer.SetPosition( player.GetPosition() ); + + //COTLog( sender, "Teleported self to " + players[0].GetGUID() ); + + } + break; + + // case M_RPCs.M_Admin_SpectatePlayer: + // TODO + // ctx.Read(Dbool); + // ctx.Read(Dstring); + // if ( !FileHandler().HasPermission( "Admin", sender ) ) + // return; + // if ( GetGame().IsServer() ) + // { + // if ( !Dbool ) + // { + // GetGame().SelectPlayer( sender, target ); + // GetRPCManager().SendRPC( "COT_Camera", "LeaveCamera", new Param, true, sender ); + + // COTLog( sender, "Left spectating/free camera" ); + // return; + // } + + // array< ref FPPlayer > players = DeserializePlayersGUID( Dstring ); + + // if ( players.Count() != 1 ) return; + + // player = players[0].PlayerObject; + + // if ( player == NULL ) return; + + // GetGame().SelectSpectator( sender, "SpectatorCamera", player.GetPosition() ); + + // GetGame().SelectPlayer( sender, NULL ); + + //GetRPCManager().SendRPC( "COT_Admin", "SpectatePlayer", new Param, true, sender, player ); + + // COTLog( sender, "Spectating " + players[0].GetGUID() ); + // }else + // { + // if ( GetGame().IsMultiplayer() ) + // { + // CurrentActiveCamera = COTCamera.Cast( Camera.GetCurrentCamera() ); + // } + + // if ( CurrentActiveCamera ) + // { + // CurrentActiveCamera.SelectedTarget( target ); + // CurrentActiveCamera.SetActive( true ); + // GetPlayer().GetInputController().SetDisabled( true ); + // } + // } + // break; + + case M_RPCs.M_Admin_Player_GodMode: + // ctx.Read(Dbool); + // ctx.Read(Dstring); + // if ( !FileHandler().HasPermission( "Admin", sender ) ) + // return; + // if ( GetGame().IsServer() ) + // { + // players = DeserializePlayersGUID( Dstring ); + + // for (i = 0; i < players.Count(); i++ ) + // { + // player = players[i].PlayerObject; + + // if ( player == NULL ) continue; + //TODO + // player.SetGodMode( Dvector ); + + //COTLog( sender, "Set god mode to " + Dvector + " for " + players[i].GetGUID() ); + // } + // } + break; + + case M_RPCs.M_Admin_SetConfigs: + ctx.Read(Dstring1); + ctx.Read(Dstring); + if ( !FileHandler().HasPermission( "Admin", sender ) ) + return; + if ( GetGame().IsServer() ) + { + ref array< string > perms = new ref array< string >; + perms.Copy( Dstring1 ); + + ref array< string > guids = new ref array< string >; + guids.Copy( Dstring ); + + players = DeserializePlayersGUID( Dstring ); + + for (i = 0; i < guids.Count(); i++ ) + { + for ( int k = 0; k < FileHandler().FPPlayers.Count(); k++ ) + { + ref FPPlayer player1 = FileHandler().FPPlayers[k]; + + if ( guids[i] == player1.GetGUID() ) + { + player1.ClearPermissions(); + + for ( int j = 0; j < perms.Count(); j++ ) + { + player1.AddPermission( perms[j] ); + } + //TODO + //GetRPCManager().SendRPC( "PermissionsFramework", "UpdatePlayer", new Param1< ref PlayerDataN >( SerializePlayer( player1 ) ), true, player1.IdentityPlayer ); + ScriptRPC Adding = new ScriptRPC(); + Adding.Write(player1); + Adding.Send(NULL, M_RPCs.M_Admin_Player_UpdatePlayer, true, player1.IdentityPlayer); + player1.Save(); + + //COTLog( sender, "Set and saved permissions for " + players[i].GetGUID() ); + } + } + } + } + break; + + // case M_RPCs.M_Admin_KickPlayer: + // ctx.Read(Dstring); + // if ( !FileHandler().HasPermission( "Admin", sender ) ) + // return; + // if ( GetGame().IsServer() ) + // { + // array< ref FPPlayer > auPlayers = DeserializePlayersGUID( Dstring ); + + // for (i = 0; i < auPlayers.Count(); i++ ) + // { + // auPlayers[i].Kick(); + ////COTLog( sender, "Kicked " + auPlayers[i].GetGUID() ); + // } + // } + // break; + + // case M_RPCs.M_Admin_BanPlayer: + // ctx.Read(Dstring); + // if ( !FileHandler().HasPermission( "Admin", sender ) ) + // return; + // if ( GetGame().IsServer() ) + // { + // auPlayers = DeserializePlayersGUID( Dstring ); + + // for (i = 0; i < auPlayers.Count(); i++ ) + // { + // auPlayers[i].Ban(); + //COTLog( sender, "Banned " + auPlayers[i].GetGUID() ); + // } + // } + // break; + + // case M_RPCs.M_Admin_SetConfigs: + // ctx.Read(Dvector); + // ctx.Read(Dstring); + // if ( !FileHandler().HasPermission( "Admin", sender ) ) + // return; + // if ( GetGame().IsServer() ) + // { + + // } + // break; + } + } + +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Teleport/TeleportModule.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Teleport/TeleportModule.c new file mode 100644 index 0000000..8b56e93 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/Files/Teleport/TeleportModule.c @@ -0,0 +1,33 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class TeleportModule +{ + void TeleportModule() + { + + } + + void Init() + { + GetFileHandler().CheckAndCreateFiles(); + GetFileHandler().LoadTeleport(); + } + +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuAbout.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuAbout.c new file mode 100644 index 0000000..e515d0c --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuAbout.c @@ -0,0 +1,44 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class AdminMenuGuiAbout extends ScriptedWidgetEventHandler +{ + + protected Widget m_Root; + protected AdminMenuGui m_Menu; + protected MultilineTextWidget m_Text_Txt; + void AdminMenuGuiAbout( Widget parent, AdminMenuGui menu ) + { + m_Root = GetGame().GetWorkspace().CreateWidgets( "com\\DayZ-SA-Tomato\\scripts\\5_Mission\\core\\modules\\GUI\\Layouts\\Admin_About.layout", parent ); + m_Menu = menu; + m_Text_Txt = MultilineTextWidget.Cast( m_Root.FindAnyWidget( "Text_About_Txt" ) ); + } + + void ~AdminMenuGuiAbout() + { + + } + + + void Focus() + { + + } + +} diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuMessage.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuMessage.c new file mode 100644 index 0000000..08d5eab --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/AdminMenuMessage.c @@ -0,0 +1,79 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class AdminMenuMessage extends UIScriptedMenu +{ + ref AdminMenuManager AMenuM; + protected MultilineTextWidget m_MessageBox_Text; + string MyText; + // int CURRENT_STAMP; + + + void AdminMenuMessage(string myText) + { + MyText = myText; + SetID(7001); + GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).CallLater( this.MessageClose, 1000, true ); + } + + override void Update(float tome) + { + + } + + void MessageClose() + { + this.Close(); + } + + + + override Widget Init() + { + layoutRoot = GetGame().GetWorkspace().CreateWidgets( "com\\DayZ-SA-Tomato\\scripts\\5_Mission\\core\\modules\\GUI\\Layouts\\MessageBox.layout", null ); + SetID(7001); + m_MessageBox_Text = TextWidget.Cast( layoutRoot.FindAnyWidget( "MessageBox_Text" ) ); + m_MessageBox_Text.SetText(MyText); + return layoutRoot; + } + + void ~AdminMenuMessage() + { + GetGame().GetCallQueue( CALL_CATEGORY_SYSTEM ).Remove( this.MessageClose ); + this.Close(); + } + + override bool OnClick( Widget w, int x, int y, int button ) + { + return true; + } + + +} +// ref AdminMenuGui Tomato_AdminMenu; + +// ref AdminMenuGui GetAdminMenu() +// { + // if( !Tomato_AdminMenu ) + // { + // Tomato_AdminMenu = new ref AdminMenuGui(); + // } + + // return Tomato_AdminMenu; +// } \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_About.layout b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_About.layout new file mode 100644 index 0000000..4653cb7 --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/Admin_About.layout @@ -0,0 +1,219 @@ +FrameWidgetClass rootFrame { + position 10 10 + size 1400 800 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + { + FrameWidgetClass command_settings_root { + ignorepointer 1 + position 0 0 + size 1 1 + hexactpos 1 + vexactpos 1 + hexactsize 0 + vexactsize 0 + { + TextWidgetClass TextWidget0 { + position 0 10 + size 1 50 + halign center_ref + hexactpos 1 + vexactpos 1 + hexactsize 0 + vexactsize 1 + style Bold + text "About" + "exact text" 0 + "size to text h" 0 + "size to text v" 0 + "text halign" center + "text valign" center + } + PanelWidgetClass PanelWidget0 { + color 0.9333 0 0.0784 1 + position 0 75 + size 0.9 3.5 + halign center_ref + hexactpos 1 + vexactpos 1 + hexactsize 0 + vexactsize 1 + style rover_sim_colorable + } + GridSpacerWidgetClass GridSpacerWidget0 { + position 65 100 + size 1273.06006 676.08002 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + Columns 1 + Rows 18 + { + TextWidgetClass TextWidget2 { + position 86.02499 79.7848 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "DayZ-Sa-Tomato " + } + TextWidgetClass TextWidget3 { + position 273.02499 161.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "This mod is mainly created for fun." + } + TextWidgetClass TextWidget4 { + position 230.02501 160.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "However it took and still takes me a lot of time " + } + TextWidgetClass TextWidget5 { + position 223.02501 185.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "to create it and adding features you request. " + } + TextWidgetClass TextWidget6 { + position 237.02501 229.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + } + TextWidgetClass TextWidget7 { + position 218.02501 186.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "I hope you enjoy it and it helps you managing" + } + TextWidgetClass TextWidget8 { + position 209.02501 186.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "your Servers if you have any feature requests" + } + TextWidgetClass TextWidget9 { + position 215.02501 224.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "I would be happy to hear them." + } + TextWidgetClass TextWidget10 { + position 255.02501 237.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "Follow the links down below." + } + TextWidgetClass TextWidget11 { + position 255.02501 271.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + } + TextWidgetClass TextWidget12 { + position 229.02501 265.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "If you wanna support this mod and keep it alive" + } + TextWidgetClass TextWidget13 { + position 219.02501 279.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "you got two options to do so :" + } + TextWidgetClass TextWidget14 { + position 219.02501 277.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "- Paypal donation @ mariusgeb@live.de" + } + TextWidgetClass TextWidget15 { + position 135.02501 279.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "- Renting a server I host DayZ and other gameservers " + } + TextWidgetClass TextWidget16 { + position 121.02499 296.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text " with fair prices and multiple locations running on strong servers" + } + TextWidgetClass TextWidget17 { + position 218.02501 307.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + } + TextWidgetClass TextWidget18 { + position 101.02499 305.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "Discord : https://discord.gg/Svgz48m" + } + TextWidgetClass TextWidget19 { + position 112.02499 296.785 + size 48 48 + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + text "Hosting Service : https://Shop.Primary-Network.com/ " + } + } + } + } + } + } +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/MessageBox.layout b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/MessageBox.layout new file mode 100644 index 0000000..27b93fb --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/GUI/Layouts/MessageBox.layout @@ -0,0 +1,37 @@ +FrameWidgetClass rootFrame { + position 49.9999 50 + size 400.44601 108.393 + halign right_ref + hexactpos 1 + vexactpos 1 + hexactsize 1 + vexactsize 1 + { + WindowWidgetClass WindowWidget0 { + position 0 0 + size 1 1 + hexactpos 1 + vexactpos 1 + hexactsize 0 + vexactsize 0 + style rover_sim_black + { + MultilineTextWidgetClass MessageBox_Text { + disabled 1 + position 0 10 + size 0.9 0.8 + halign center_ref + valign bottom_ref + hexactpos 1 + vexactpos 1 + hexactsize 0 + vexactsize 0 + "text halign" center + "text valign" center + wrap 1 + "condense whitespace" 1 + } + } + } + } +} \ No newline at end of file diff --git a/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/HordeModule.c b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/HordeModule.c new file mode 100644 index 0000000..e709b1e --- /dev/null +++ b/Dayz-Sa-Tomato/addons/DayZ-SA-Tomato/scripts/5_Mission/core/modules/HordeModule.c @@ -0,0 +1,152 @@ + /* + DayZ SA Tomato Gui Admin tool for DayZ Standalone. Contact DayZ-SA-Tomato@Primary-Network.de + Copyright (C) 2018 DayZ-SA-Tomato + + This file is part of DayZ SA Tomato. + + DayZ SA Tomato is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + DayZ SA Tomato is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DayZ SA Tomato. If not, see . + */ +class HordeModule +{ + + + void HordeModule() + { + GetDayZGame().Event_OnRPC.Insert( this.ReceiveRPC ); + } + + void Spawn(vector horde_pos, int Spawned_Horde = 50, int Spawned_Distance = 50 , string name = "", PlayerIdentity sender = NULL) + { + if ( GetGame().IsServer() ) + { + vector hdynamic_pos; + for(int hor = 0; hor < Spawned_Horde; hor++) + { + float ha = Math.RandomFloat(0.4, 1.0) * 2 * Math.PI; + float hr = Spawned_Distance * Math.Sqrt(Math.RandomFloat(0.4, 1.0)); + hdynamic_pos = horde_pos; + hdynamic_pos[0] = hdynamic_pos[0]+(hr * Math.Cos(ha)); + hdynamic_pos[2] = hdynamic_pos[2]+(hr * Math.Sin(ha)); + hdynamic_pos[1] = GetGame().SurfaceY(hdynamic_pos[0], hdynamic_pos[2]) + 0.3; + GetGame().CreateObject(R_Horde.GetRandomElement(), hdynamic_pos, false, true); + + } + if(name == "") + { + TL().status(sender, "Horde Spawned at Position: " + horde_pos.ToString(false)); + }else{ + if (GetFileHandler().IsConfig("Horde_Message")) + { + string msg = GetFileHandler().GetConfig("Horde_Message_Location"); + int count = msg.Replace("{Location}", name); + GetGame().ChatPlayer(0, msg); + TL().status(sender, msg); + } + TL().status(sender, "Horde Spawned at Location : " + name); + } + }else{ + ScriptRPC Rpc = new ScriptRPC(); + Rpc.Write(horde_pos); + Rpc.Write(Spawned_Horde); + Rpc.Write(Spawned_Distance); + Rpc.Write(name); + Rpc.Send(NULL, M_RPCs.M_Admin_Horde, true, NULL); + } + + + } + + void ReceiveRPC( PlayerIdentity sender, Object target, int rpc_type, ParamsReadContext ctx ) + { + switch(rpc_type) + { + + case M_RPCs.M_Admin_Horde: + vector HPos; //Vector Postition + int HCount; //Vector Postition + int HDist; //Vector Postition + string name; + ctx.Read(HPos); + ctx.Read(HCount); + ctx.Read(HDist); + ctx.Read(name); + if ( GetGame().IsServer() ) + { + Spawn(HPos, HCount, HDist,name, sender); + } + + break; + } + } + + protected ref TStringArray R_Horde = + { + "ZmbF_BlueCollarFat_Green", + "ZmbF_BlueCollarFat_Red", + "ZmbF_BlueCollarFat_White", + "ZmbF_CitizenANormal_Beige", + "ZmbF_CitizenANormal_Blue", + "ZmbF_CitizenANormal_Brown", + "ZmbF_CitizenBSkinny", + "ZmbF_Clerk_Normal_Blue", + "ZmbF_Clerk_Normal_Green", + "ZmbF_Clerk_Normal_Red", + "ZmbF_Clerk_Normal_White", + "ZmbF_DoctorSkinny", + "ZmbF_HikerSkinny_Blue", + "ZmbF_HikerSkinny_Green", + "ZmbF_HikerSkinny_Grey", + "ZmbF_HikerSkinny_Red", + "ZmbF_JoggerSkinny_Blue", + "ZmbF_JoggerSkinny_Brown", + "ZmbF_JoggerSkinny_Green", + "ZmbF_JoggerSkinny_Red", + "ZmbF_JournalistNormal_Blue", + "ZmbF_JournalistNormal_Green", + "ZmbF_JournalistNormal_Red", + "ZmbF_JournalistNormal_White", + "ZmbF_MechanicNormal_Beige", + "ZmbF_MechanicNormal_Green", + "ZmbF_MechanicNormal_Grey", + "ZmbF_MechanicNormal_Orange", + "ZmbF_MilkMaidOld_Beige", + "ZmbF_MilkMaidOld_Black", + "ZmbF_MilkMaidOld_Green", + "ZmbF_MilkMaidOld_Grey", + "ZmbF_NurseFat", + "ZmbF_ParamedicNormal_Blue", + "ZmbF_ParamedicNormal_Green", + "ZmbF_ParamedicNormal_Red", + "ZmbF_PatientOld", + "ZmbF_PoliceWomanNormal", + "ZmbF_ShortSkirt_beige", + "ZmbF_ShortSkirt_black", + "ZmbF_ShortSkirt_brown", + "ZmbM_VillagerOld_White", + "ZmbM_VillagerOld_Green", + "ZmbM_SurvivorDean_Black", + "ZmbM_SoldierVest", + "ZmbM_SoldierHelmet", + "ZmbM_SoldierAlice", + "ZmbM_SkaterYoung_Grey", + "ZmbM_SkaterYoung_Blue", + "ZmbM_priestPopSkinny", + "ZmbM_PolicemanFat", + "ZmbM_PatrolNormal_Summer", + "ZmbM_ParamedicNormal_Green", + "ZmbM_ParamedicNormal_Black", + "ZmbM_OffshoreWorker_Orange", + }; +} + \ No newline at end of file diff --git a/README.md b/README.md index b16d0fd..f3788a3 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# DayZ SA Tomato +# DayZ-SA-Tomato -Dayz Standalone UI Admin Tool +Dayz Standalone GUI Based Admin Tool @@ -10,69 +10,111 @@ See CHANGELOG.md ## News -## 15.12.2018 23:00 +## 20.01.2019 21:00 -### Fixed - -- For 1.0 Update (make sure to kopy the Key from Keys folder again !) ### Added -- Teleport Locations Check the Config/List Folder u can add your own Locations to it (Adding Locations from ingame does not work since filewrite is bugged at the moment) +- Teleport Locations added right from in-game gui. +- Spawn a changable size horde of zombies by a simple click on the map or on a defined location. +- Delete Object on cursor +- Player files sorted by Steam64ID for easy adding of admin to the server. +- Teleport on Map click +- Horde on Map Click +- Customizable Kill feed (standard is disabled, change it in Config.txt File in your profiles folder) +- Customizable Welcome message +- Kill log file +- Spectate Player + ### next up - - + +- TBA -#### If Someone got the mod to work on a 3rd Party hoster Cantact me or join https://discord.gg/Svgz48m +#### If Someone has this mod working on a 3rd Party host (GSP) PLEASE Cantact me or join https://discord.gg/Svgz48m to let us know to help others with the same service get their mod working as well ## Notes -You can do with this tool what you want as the licence says if you add any features to it i would appreciate if you would share your code so that everyone can benefit from it. +You can do what you like with this tool as the license states. But if you add any features to it, i would appreciate if you would share your code so that everyone can benefit from it. -You could cantact me per mail at DayZ-SA-Tomato@Primary-Network.de +You could cantact me by email at DayZ-SA-Tomato@Primary-Network.de Or @Discord https://discord.gg/qqjwVXV -### Installing - -0. Check out this Link if you are using a 3rd party hoster they changed there Wiki since a user asked them how to Install this mod probs to them https://trugaming.com/wiki/index.php?title=DayZ#Server_Side_Mods hoefully this helps a little bit -1. Copy DayZ-SA-Tomato to your Server/Client main Folder -2. Copy SchnitzelPommes.bikey to your Servers keys folder -3. Make sure YourServerFolder/DayZ-Sa-Tomato/Config/Admins.txt file exist (You can delete it Client side) -4. If You need to use the mod folder with an @ Make sure to create DayZ-Sa-Tomato Folder with the Config Folder in it or it wont load Admins.txt and TpLocations file -5. Make sure when step 3 completed add your Steam64ID to this file(for every ID 1 line) -6. Set start param -mod=DayZ-SA-Tomato at Server/Client -7. If not exist Add -profiles=D:\YourProfileFolderMaybe/DayzServer/Log and -scrAllowFileWrite To your server Parameters -![alt text](https://steamuserimages-a.akamaihd.net/ugc/43117016076707122/9D374D1F7933C13B477EE6792A3735D9FFAC74B4/) - - -Also Available in the Steam workshop (not updated all the time) -https://steamcommunity.com/sharedfiles/filedetails/?id=1575615457 - - - - - - -## Test and Use - -Start your Server and login - -Check your Server log for +### Installation +0. If you upgrade from an older version delete all of it and start at step 1. +1. Click download, get the zip file, and open it +1. Copy DayZ-SA-Tomato to your Server AND Client main (ROOT) Folder +2. Inside "keys" folder copy SchnitzelPommes.bikey to your Servers keys folder +``` +``` +![alt text](https://i.ibb.co/5jcGNRQ/Screenshot-3.png) +``` +``` +4. include "-mod=DayZ-SA-Tomato" in Server start parameters. +5. If profiles isn't set, add "-profiles=PATH TO PROFILES FOLDER" as well then save and close. +``` +``` +![alt text](https://i.ibb.co/YdpXCwS/Screenshot-2.png) +``` +``` +6. Move the DayZ-Sa-Tomato profile folder from the mod folder's Tomato_Profiles folder to server profiles folder. +``` +``` +![alt text](https://i.ibb.co/HgSFFbF/Screenshot-3.png) +``` +``` +6. Make sure DayZ-Sa-Tomato is loaded in DayZ Launcher before starting +``` +``` +![alt text](https://i.ibb.co/427c1Mr/Screenshot-1.png) +``` +``` +7. If starting game from Steam make sure to add "-mod=Dayz-Sa-Tomato" to start params. +``` +``` +![alt text](https://i.ibb.co/t3swkS3/Screenshot-7.png) +``` +``` +8. Join your server and login by pressing "T" and typing #login ADMINPW and pressing "enter" +``` +``` +![alt text](https://i.ibb.co/Sv78jk2/Screenshot-12.png) +``` +``` +9. Press "T" again and this time type /opme and press "enter" +10. ## DO NOT DO ANYTHING ELSE +11. Close out of the game and restart the server +12. Join the server once again and this time WITHOUT logging in hit "m" and there you go! +``` +``` +Please note that the profiles folder on the server does NOT have to be named "profiles" that was just used to clarify locations. +``` +``` +Check out this Link if you are using a 3rd party hoster. They changed their Wiki since a user asked them how to Install this mod probs to them https://trugaming.com/wiki/index.php?title=DayZ#Server_Side_Mods hopefully this helps a little bit +``` +``` +### Enabling Logs and Messages + +-First thing you do is to go in to your server and open DayZServer/URPROFILES/Tomato_Profiles/Config/Config.txt file. Find the features you'd like to add and change the number 0 at the end to a 1 to enable it. + +-Next if you want to customize the messages you can but REMEMBER you can not change certain parts or you wont get all your information from the message. Make sure you DO NOT edit anyting BEFORE the = symbol, the = symbol, or anything in the {} brackets. +``` +``` +![alt text](https://i.ibb.co/4KWcsCJ/Screenshot-2.png) ``` -Adding Admin: ``` -If this Meessage appears the server loadet the tool if not you did something wrong +## Troubleshooting +-If you are still not able to access the admin tool with "M" there IS another way to activate the menu on your server. First, go to your DayZ server root and find your "profiles" (or whatever you named your profiles folder) and open it. Inside that folder will be a DayZ-Sa-Tomato folder. Inside that there is a "config" folder and inside that one is a "players" folder. There should be a file in there YOURSTEAM64ID.player (i.e. 76561198161388867.Player). right click and edit that to change Admin = 0 to Admin = 1 save and close that file. Back out to the "config" folder and edit config.txt to change the first option Setup = 0 to setup = 1. Restart the server and join your server and "M" should now work for you. +``` +``` +![alt text](https://i.ibb.co/NKWzG6q/Screenshot-1.png) ``` -In Game press "M" Key ``` -If Your Client is configured with the mod a Message will appear @chat -If Your Server is also configured correct and Admins.txt Contains your id The Ui will open - ## Features * **In Game** - M Key brings up the UI @@ -87,10 +129,21 @@ If Your Server is also configured correct and Admins.txt Contains your id The Ui * **Commands Tab** - Nighttime * **Commands Tab** - Spawn Car repaired and filled * **Commands Tab** - Refill nearest Car +* **Commands Tab** - Delete at cursor + + + + +![alt text](https://i.ibb.co/f2f231q/COMMANDS.jpg) ------------ -* **Spawn Tab** - Item/AI/Building Spawning +* **Spawn Tab** - Item/AI/Building Spawning + + + + +![alt text](https://i.ibb.co/rGY1kWS/SPAWN.jpg) ------------ @@ -101,17 +154,50 @@ If Your Server is also configured correct and Admins.txt Contains your id The Ui * **Player Tab** - Disable Stamina for specific Player * **Player Tab** - Heal Player * **Player Tab** - Kill Player +* **Player Tab** - Spectate Player + + + + +![alt text](https://i.ibb.co/HNtddT5/PLAYER.jpg) + +------------ + +* **Teleport Tab** - Teleport location list +* **Teleport Tab** - Add/remove teleport locations in list +* **Teleport Tab** - Spawn zombie hordes on locations + + + + +![alt text](https://i.ibb.co/XxWSmCb/TELEPORT.jpg) ------------ * **Map Tab** - Shows Location of all Players on the Map +* **Map Tab** - Spawn Zombie Horde on map +* **Map Tab** - Teleport by map + + + + +![alt text](https://i.ibb.co/h73WcvQ/MAP.jpg) + +------------ + +* **About Tab** - All the information about support for DayZ-Sa-Tomato + + + + +![alt text](https://i.ibb.co/sVfqfTx/20190119155652-1.jpg) + + +------------ ### Known Issues * **Spwan Tab** - Item Preview (right side not working) -* **Spwan Tab** - Building spawning in ground -* **Player Tab** - Blood Energy not showing correctly (sometimes it does) -* **Player Tab** - Send Message not working ## License