C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Game.Rust.Cui;
using Oxide.Core;
using Oxide.Core.Plugins;
using System.Linq;
using System.Data;
using System.Collections.Generic;
using Oxide.Core.Libraries;
using System.Reflection;
using System;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("EventDead", "Larry", "0.0.8")]
internal class EventDead : RustPlugin
{
//GUI variables
public string mainName = null;
public string mainCount = null;
private List<Vector3> spawns;
private List<EventPlayer> EventPlayers;
private List<BasePlayer> DeletingAdmins;
private Timer freezeTimer;
private FieldInfo CPstartPos;
private FieldInfo CPendPos;
private FieldInfo CPsecondsToTake;
private FieldInfo CPsecondsTaken;
private bool doAirdrop;
private float secondsToTake;
private bool EventOpen;
private bool EventStarted;
private bool EventLive;
private bool EventLimitPlayers;
private string EventKit;
private string json1;
private int maxSpawns;
private string spawnName;
public static Item itemp;
private string winnerFirst = "N/A"; // added to display winners when typing command /winners
private string winnerSecond = "N/A";
private string winnerThird = "N/A";
private List<BasePlayer> players;
private CuiElementContainer elements;
public static FieldInfo lastPositionValue;
private int currentCount = 0;
public Vector3 airdropPos;
private List<UnityEngine.GameObject> objectsToBlow;
[PluginReference]
Plugin Spawns2;
[PluginReference]
Plugin Kits;
[PluginReference]
Plugin checkCeiling;
[PluginReference]
Plugin PopupNotifications;
private static string MessagePrefix = "[ <color=#406B35>DeadLaugh Event</color> ]: ";
private static string MessageEventOpen = "has opened the Deathmatch Arena event! Type <color=red>/event</color> to join!";
private static string MessageEventLaunch = "Event will begin in <color=red>10</color> seconds!";
private static string MessageEventWinner = "The winner is <color=red>{0}</color>!";
private static string MessageEventWinner2 = "They will be momentarily sacrificed to the gods!";
/////////////////////////////////////////////////////////////
/////////////// DATA STRUCTURES /////////////////////////////
class EventInvItem
{
public string itemid;
public string bp;
public string skinid;
public string container;
public string amount;
public float durability;
public List<Item> mods;
public int ammo;
public ItemDefinition ammoType;
public EventInvItem()
{
}
public EventInvItem(int itemid, bool bp, string container, int amount, int skinid = 0, float durability = 100f, int ammo = 0, ItemDefinition ammoType = null, List<Item> itemlist = null)
{
this.itemid = itemid.ToString();
this.bp = bp.ToString();
this.skinid = skinid.ToString();
this.amount = amount.ToString();
this.container = container;
this.durability = durability;
this.mods = itemlist;
this.ammo = ammo;
this.ammoType = ammoType;
}
}
public static List<Item> getMods(ItemContainer contents){
if(contents == null)
return null;
List<Item> mods = new List<Item>();
foreach(Item itm in contents.itemList){
mods.Add(itm);
//ConsoleSystem.Broadcast("chat.add", new object[] { 0, itm.info.displayName.english });
}
return mods;
}
public static int getAmmo(BaseEntity pro){
var pro1 = pro as BaseProjectile;
if (pro1 == null)
return 0;
return pro1.primaryMagazine.contents;
}
public static ItemDefinition getAmmoType(BaseEntity pro){
var pro1 = pro as BaseProjectile;
if (pro1 == null)
return null;
//ConsoleSystem.Broadcast("chat.add", new object[] { 0, pro1.primaryMagazine.ammoType.ToString() });
return pro1.primaryMagazine.ammoType;
}
class EventPlayer : MonoBehaviour
{
public BasePlayer player;
public bool inEvent;
public bool savedInventory;
public bool savedHome;
public Vector3 spawnVec;
public List<EventInvItem> InvItems = new List<EventInvItem>();
public List<Vector3> spawns = new List<Vector3>();
public Vector3 Home;
public float hydration; // added to save/restore hydration and calories on save/teleport
public float calories;
void Awake()
{
inEvent = true;
savedInventory = false;
savedHome = false;
player = GetComponent<BasePlayer>();
}
public void SaveHome()
{
if (!savedHome)
Home = player.transform.position;
savedHome = true;
calories = player.metabolism.calories.value;
hydration = player.metabolism.hydration.value;
}
public void TeleportHome()
{
if (!savedHome)
return;
ForcePlayerPosition(player, Home);
savedHome = false;
player.metabolism.calories.value = calories;
player.metabolism.hydration.value = hydration;
}
public void SaveInventory()
{
if (savedInventory)
return;
InvItems.Clear();
foreach (Item item in player.inventory.containerWear.itemList)
{
InvItems.Add(new EventInvItem(item.info.itemid, item.IsBlueprint(), "wear", item.amount, item.skin, item.condition, getAmmo(item.GetHeldEntity()), getAmmoType(item.GetHeldEntity()), getMods(item.contents)));
}
foreach (Item item in player.inventory.containerMain.itemList)
{
InvItems.Add(new EventInvItem(item.info.itemid, item.IsBlueprint(), "main", item.amount, item.skin, item.condition, getAmmo(item.GetHeldEntity()), getAmmoType(item.GetHeldEntity()), getMods(item.contents)));
}
foreach (Item item in player.inventory.containerBelt.itemList)
{
InvItems.Add(new EventInvItem(item.info.itemid, item.IsBlueprint(), "belt", item.amount, item.skin, item.condition, getAmmo(item.GetHeldEntity()), getAmmoType(item.GetHeldEntity()), getMods(item.contents)));
}
savedInventory = true;
}
public void RestoreInventory()
{
foreach (EventInvItem kitem in InvItems)
{
Item item = ItemManager.CreateByItemID(int.Parse(kitem.itemid), int.Parse(kitem.amount), Convert.ToBoolean(kitem.bp));
item.skin = int.Parse(kitem.skinid);
item.condition = kitem.durability;
var weapon = item.GetHeldEntity() as BaseProjectile;
if (weapon != null){
weapon.primaryMagazine.contents = kitem.ammo;
if(kitem.ammoType != null){
weapon.primaryMagazine.ammoType = kitem.ammoType;
}
}
if(kitem.mods != null){
foreach(Item it in kitem.mods){
item.contents.AddItem(it.info, 1);
}
}
player.inventory.GiveItem(item, kitem.container == "belt" ? player.inventory.containerBelt : kitem.container == "wear" ? player.inventory.containerWear : player.inventory.containerMain);
}
savedInventory = false;
}
}
void Loaded()
{
airdropPos = new Vector3();
airdropPos = Vector3.zero;
doAirdrop = false;
CPstartPos = typeof(CargoPlane).GetField("startPos", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
CPendPos = typeof(CargoPlane).GetField("endPos", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
CPsecondsToTake = typeof(CargoPlane).GetField("secondsToTake", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
CPsecondsTaken = typeof(CargoPlane).GetField("secondsTaken", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
EventLive = false;
json1 = null;
EventPlayers = new List<EventPlayer>();
DeletingAdmins = new List<BasePlayer>();
objectsToBlow = new List<UnityEngine.GameObject>();
spawns = new List<Vector3>();
lastPositionValue = typeof(BasePlayer).GetField("lastPositionValue", (BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.NonPublic));
}
void Unloaded()
{
foreach (EventPlayer player in EventPlayers)
{
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_top", null, null, null, null));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_countdown", null, null, null, null));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_blackout", null, null, null, null));
player.player.SetPlayerFlag(BasePlayer.PlayerFlags.VoiceMuted, false);
}
if(freezeTimer != null){
freezeTimer.Destroy();
}
SendPlayersHome();
RedeemPlayersInventory();
TryEraseAllPlayers();
EjectAllPlayers();
EventPlayers.Clear();
}
void OnServerInitialized()
{
EventOpen = false;
EventStarted = false;
}
[ChatCommand("guitest")]
private void guitest(BasePlayer player, string command, string[] args)
{
elements = new CuiElementContainer();
mainName = elements.Add(new CuiPanel
{
Image =
{
Color = "0.1 0.1 0.1 1"
},
RectTransform =
{
AnchorMin = "0.0 0.95",
AnchorMax = "1.0 1.0"
},
CursorEnabled = false
}, "HUD/Overlay", "event_top"
);
elements.Add(new CuiLabel
{
Text =
{
Text = "2 Players Left.",
FontSize = 24,
Align = TextAnchor.MiddleCenter
},
RectTransform =
{
AnchorMin = "0.0 0.0",
AnchorMax = "1.0 1.0"
}
}, "event_top");
elements.Add(new CuiLabel
{
Text =
{
Text = "DeadLaugh Event",
FontSize = 16,
Align = TextAnchor.MiddleLeft
},
RectTransform =
{
AnchorMin = "0.025 0.0",
AnchorMax = "1.0 1.0"
}
}, "event_top");
CuiHelper.AddUi(player, elements);
}
[ChatCommand("guiclear")]
private void guiclear(BasePlayer player, string command, string[] args)
{
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_top", null, null, null, null));
}
[ChatCommand("blackout")] //remove blackout
private void eventblackout(BasePlayer player, string command, string[] args)
{
if (!hasAccess(player)) return;
foreach (EventPlayer eventplayer in EventPlayers)
{
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = eventplayer.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_blackout", null, null, null, null));
// Effect.server.Run("assets/bundled/prefabs/fx/c4_explosion.prefab", eventplayer.player.transform.position, Vector3.zero, null, false);
}
}
////////////////// FREEZE Players ///////////////////////////
private void OnTimerFreeze()
{
if(!EventLive){
foreach (EventPlayer player in EventPlayers)
{
if (Vector3.Distance(player.player.transform.position, player.spawnVec) < 1) continue;
// player.player.transform.position = player.spawnVec;
//lastPositionValue.SetValue(player.player, player.transform.position);
// BroadcastToChat(Vector3.Distance(player.player.transform.position, player.spawnVec).ToString());
// player.player.ClientRPCPlayer(null, player.player, "ForcePositionTo", new object[] { player.spawnVec });
ForcePlayerPosition3(player.player, player.spawnVec);
//player.player.TransformChanged();
}
}
}
[ChatCommand("winners")] // show winners
private void eventwinners(BasePlayer player, string command, string[] args)
{
SendReply(player, "[ <color=#406B35>DeadLaugh Event Winners</color> ]: <color=red>First</color>: " + winnerFirst + ", <color=red>Second</color>: " + winnerSecond + ", <color=red>Third</color>: " + winnerThird);
}
[ChatCommand("event_floors")]
private void eventfloors(BasePlayer player, string command, string[] args)
{
if(!hasAccess(player)) return;
if(!DeletingAdmins.Contains(player)){
DeletingAdmins.Add(player);
SendReply(player, "Exploding Floors: ON! Anything you place will explode on Event Launch.");
}
else{
DeletingAdmins.Remove(player);
SendReply(player, "Exploding Floors: OFF.Your building is back to normal.");
}
}
[ChatCommand("event_launch")]
private void eventlaunch(BasePlayer player, string command, string[] args)
{
if(!hasAccess(player)) return;
EventOpen = false;
EventStarted = false;
foreach(EventPlayer player1 in EventPlayers){
player1.player.SetPlayerFlag(BasePlayer.PlayerFlags.VoiceMuted, false);
}
startCountdown();
BroadcastToChat(MessageEventLaunch);
}
[ChatCommand("event_new")]
private void eventnew(BasePlayer player, string command, string[] args)
{
if(!hasAccess(player)) return;
if(args.Length < 2){
SendReply(player, "The syntax is /event_new [kitname] [spawnlist name] [doAirdrop true/false]");
return;
}
if (args[0] != "nokit")
{
object kit = Kits?.Call("CanRedeemKit", player, args[0]);
if ((kit is string) && (kit.ToString().Contains("doesn't exist")))
{
SendReply(player, "Kit does not exist! To start without a kit, type: <color=red>/event_new nokit " + args[1] + "</color>");
return;
}
}
if(args.Length == 3){
if(args[2] == "true"){
doAirdrop = true;
}
}
EventKit = args[0];
spawnName = args[1];
EventLimitPlayers = false;
object gsc = Spawns2.Call("GetSpawnsCount", new object[] { spawnName });
if ((gsc is string) && (gsc.ToString() == "This file doesn't exist"))
{
SendReply(player, "Spawn does not exist: <color=red>" + spawnName + "</color>");
return;
}
maxSpawns = Convert.ToInt32(gsc);
cancelEvent();
EventOpen = true;
airdropPos = Vector3.zero;
Vector3 adCenter = new Vector3(0,0,0);
for(int i=1; i<=maxSpawns; i++)
{
Vector3 spawnPos = (Vector3)Spawns2.Call("GetSpawn", new object[] { spawnName, i-1});
spawns.Add(spawnPos);
adCenter += spawnPos;
}
airdropPos = adCenter/maxSpawns;
freezeTimer = timer.Every(1, OnTimerFreeze);
winnerFirst = "N/A";
winnerSecond = "N/A";
winnerThird = "N/A";
BroadcastToChat("<color=red>" + player.displayName + "</color> " + MessageEventOpen);
BroadcastToChat("<color=brown>Inventory and items being crafted will be restored upon death.</color>");
}
[ChatCommand("event_cancel")]
private void closeevent(BasePlayer player, string command, string[] args)
{
if(!hasAccess(player)) return;
if (EventOpen)
{
cancelEvent();
BroadcastToChat("Event has been cancelled.");
}
else{
SendReply(player, "No event to close");
}
return;
}
[ChatCommand("event_msg")]
private void eventmsg(BasePlayer player, string command, string[] args)
{
if(!hasAccess(player)) return;
string msg = "";
for(int i = 0; i < args.Length; i++)
msg = msg + " " + args[i];
foreach (EventPlayer player1 in EventPlayers)
{
PopupNotifications?.Call("CreatePopupNotification", msg, player1.player);
}
return;
}
[ChatCommand("event")]
private void joinevent(BasePlayer player, string command, string[] args)
{
if (EventOpen && player.IsAlive() )
{
if((bool)checkCeiling.Call("isCeiling", new object[] { player })){
SendReply(player, "You need to be on the ground floor before teleporting to the event! (This avoids potential death on respawn)");
return;
}
// MeshBatchPhysics.Raycast(player.transform.position + new Vector3(0f, -1.15f, 0f), Vector3Down, out cachedRaycast, out cachedBoolean, out cachedhitInstance);
if (maxSpawns != 0 && EventPlayers.Count >= maxSpawns){
SendReply(player, "Event is full.");
return;
}
if (player.GetComponent<EventPlayer>())
{
if (EventPlayers.Contains(player.GetComponent<EventPlayer>())){
SendReply(player, "You are already in the event.");
return;
}
}
EventPlayer event_player = player.GetComponent<EventPlayer>();
if (event_player == null) event_player = player.gameObject.AddComponent<EventPlayer>();
event_player.inEvent = true;
event_player.enabled = true;
EventPlayers.Add(event_player);
if (player.IsWounded()){ // wounded prior to teleport
player.SetPlayerFlag(BasePlayer.PlayerFlags.Wounded, false);
player.CancelInvoke("WoundingEnd");
player.metabolism.bleeding.value = 0f;
}
player.CancelInvoke("InventoryUpdate"); // bug fix: players who were crafting joined with said crafting items/materials
player.inventory.crafting.CancelAll(true);
SaveHomeLocation(player);
SaveInventory(player);
player.inventory.Strip();
player.SetPlayerFlag(BasePlayer.PlayerFlags.VoiceMuted, true);
//Interface.CallHook("OnEventPlayerSpawn", new object[] { player });
event_player.spawnVec = spawns.First();
ForcePlayerPosition(player, event_player.spawnVec);
if (player.IsWounded()){ // wounded from teleport bug
player.SetPlayerFlag(BasePlayer.PlayerFlags.Wounded, false);
player.CancelInvoke("WoundingEnd");
player.metabolism.bleeding.value = 0f;
}
player.health = 100f;
if(!EventLimitPlayers)
spawns.Remove(event_player.spawnVec);
//updateGUI();
updateGUI(player);
BroadcastToChat(string.Format("{0} has joined the Event! (#<color=red>{1}</color>)", player.displayName, EventPlayers.Count.ToString()));
return;
}
else{
SendReply(player, "Event not open.");
return;
}
}
private void cancelEvent()
{
EventStarted = false;
EventOpen = false;
doAirdrop = false;
EventLive = false;
airdropPos = Vector3.zero;
spawns.Clear();
//redeem stuff
SendPlayersHome();
RedeemPlayersInventory();
TryEraseAllPlayers();
EjectAllPlayers();
EventPlayers.Clear();
if(freezeTimer != null){
freezeTimer.Destroy();
}
//BroadcastToChat("Event has been cancelled.");
return;
}
private void startCountdown()
{
currentCount = 10;
timer.Repeat(1, 13, () => nextCountdown());
}
private void nextCountdown()
{
if(currentCount >= 0){
if(elements != null){
elements = null;
}
elements = new CuiElementContainer();
string numToShow = currentCount.ToString();
string color = "0 0 0 1.0";
if(currentCount == 0){
numToShow = "FIGHT!";
color = "0.50 0.0 0.0 1.0";
foreach(EventPlayer player in EventPlayers){
GivePlayerKit(player.player, EventKit);
}
EventStarted = true;
}
BroadcastToChat(numToShow);
var oldCount = mainCount;
mainCount = elements.Add(new CuiPanel
{
Image =
{
Color = "0.1 0.1 0.1 0"
},
RectTransform =
{
AnchorMin = "0.45 0.45",
AnchorMax = "0.55 0.55"
},
CursorEnabled = false
}, "HUD/Overlay", "event_countdown");
elements.Add(new CuiLabel
{
Text =
{
Text = numToShow,
FontSize = 34,
Align = TextAnchor.MiddleCenter,
Color = color
}
, RectTransform =
{
AnchorMin = "0.0 0.0",
AnchorMax = "1.0 1.0"
}
}, "event_countdown");
if(currentCount == 0){
ConsoleSystem.Run.Server.Normal("launchEvent");
}
foreach (EventPlayer player in EventPlayers)
{
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_countdown", null, null, null, null));
CuiHelper.AddUi(player.player, elements);
if(currentCount > 0){
Effect.server.Run("assets/bundled/prefabs/fx/door/lock.code.lock.prefab", player.player.transform.position, Vector3.zero, null, false);
}
if(currentCount == 0){
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_blackout", null, null, null, null));
Effect.server.Run("assets/bundled/prefabs/fx/entities/helicopter/heli_explosion.prefab", player.player.transform.position, Vector3.zero, null, false);
//BroadcastToChat("SDFDDSF");
}
}
}
else{
foreach (EventPlayer player in EventPlayers)
{
if(mainCount != null){
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_countdown", null, null, null, null));
}
}
}
currentCount--;
}
[ConsoleCommand("launchEvent")]
private void launchEvent(ConsoleSystem.Arg arg)
{
foreach (UnityEngine.GameObject gobject in objectsToBlow)
{
UnityEngine.GameObject.Destroy(gobject);
}
objectsToBlow.Clear();
EventLive = true;
if(freezeTimer != null){
freezeTimer.Destroy();
}
if((doAirdrop) && (airdropPos != Vector3.zero)) {
callAirdrop(airdropPos, 300f);
}
}
[ChatCommand("event_airdrop")]
private void eventairdrop(BasePlayer player, string command, string[] args)
{
if(!hasAccess(player)) return;
float speed = 40f;
float trySpeed = float.Parse(args[0], System.Globalization.CultureInfo.InvariantCulture.NumberFormat);
if (trySpeed is float)
{
speed = trySpeed;
}
callAirdrop(player.transform.position, speed);
SendReply(player, $"Airdrop called to your position with {speed.ToString()} speed.");
}
void callAirdrop(Vector3 pos, float airdropSpeed)
{
BaseEntity entity = GameManager.server.CreateEntity("assets/bundled/prefabs/events/cargo_plane.prefab", new Vector3(), new Quaternion(1f,0f,0f,0f));
if (entity != null)
{
CargoPlane plane = entity.GetComponent<CargoPlane>();
plane.InitDropPosition(pos);
entity.Spawn(true);
CPsecondsToTake.SetValue(plane, Vector3.Distance( (Vector3)CPendPos.GetValue(plane), (Vector3)CPstartPos.GetValue(plane) ) / airdropSpeed );
}
}
private void OnEntityBuilt(Planner planner, UnityEngine.GameObject component)
{
if(DeletingAdmins.Contains(planner.ownerPlayer)){
objectsToBlow.Add(component);
PrintToChat(planner.ownerPlayer, "Event structure place.");
}
}
private BaseEntity CreateRocket(Vector3 startPoint, Vector3 direction, bool isFireRocket)
{
ItemDefinition projectileItem;
projectileItem = ItemManager.FindItemDefinition("ammo.rocket.basic");
ItemModProjectile component = projectileItem.GetComponent<ItemModProjectile>();
BaseEntity entity = GameManager.server.CreateEntity(component.projectileObject.resourcePath, startPoint, new Quaternion(), true);
TimedExplosive timedExplosive = entity.GetComponent<TimedExplosive>();
ServerProjectile serverProjectile = entity.GetComponent<ServerProjectile>();
serverProjectile.gravityModifier = 0f;
serverProjectile.speed = 20f;
timedExplosive.timerAmountMin = 0.1f;
timedExplosive.timerAmountMax = 0.1f;
entity.SendMessage("InitializeVelocity", (object) (direction * 0.5f));
entity.Spawn(true);
return entity;
}
[ChatCommand("leave")]
void cmdEventLeave(BasePlayer player, string command, string[] args)
{
object success = LeaveEvent(player);
if (success is string)
{
SendReply(player, (string)success);
BroadcastToChat(string.Format("{0} has left the Event! (#<color=red>{1}</color>)", player.displayName, EventPlayers.Count.ToString()));
return;
}
}
[ConsoleCommand("closeui")]
private void CloseUi(ConsoleSystem.Arg arg)
{
// CuiHelper.DestroyUi(arg.Player(), mainName);
clearGUI();
}
private int activeCount(){
int count1 = 0;
foreach (EventPlayer player in EventPlayers)
{
if(player.inEvent){
count1++;
}
}
return count1;
}
private BasePlayer getWinner(){
foreach (EventPlayer player in EventPlayers)
{
if(player.inEvent){
return player.player;
}
}
return null;
}
private void clearGUI()
{
foreach (EventPlayer player1 in EventPlayers)
{
if(mainName != null){
CuiHelper.DestroyUi(player1.player, mainName);
}
}
}
/*
private void updateGUI()
{
// startCountdown();
if(elements != null){
elements = null;
}
elements = new CuiElementContainer();
string mainNameTemp = mainName;
if(!EventStarted){
json1 = @"[
{
""name"": ""event_blackout"",
""parent"": ""HUD/Overlay"",
""components"":
[
{
""type"":""UnityEngine.UI.RawImage"",
""imagetype"": ""Filled"",
""color"": ""1.0 1.0 1.0 1.0"",
""url"": ""http://rust.deadlaugh.com/overlay/dl2.png"",
""fadeIn"": ""1""
},
{
""type"":""RectTransform"",
""anchormin"": ""0.0 0.0"",
""anchormax"": ""1.0 1.0""
}
]
}
]
";
}
mainName = elements.Add(new CuiPanel
{
Image =
{
Color = "0.1 0.1 0.1 1"
},
RectTransform =
{
AnchorMin = "0.0 0.95",
AnchorMax = "1.0 1.0"
},
CursorEnabled = false
},"HUD/Overlay", "event_top");
elements.Add(new CuiLabel
{
Text =
{
Text = activeCount().ToString() + " Players Left.",
FontSize = 24,
Align = TextAnchor.MiddleCenter
},
RectTransform =
{
AnchorMin = "0.0 0.0",
AnchorMax = "1.0 1.0"
}
}, "event_top");
elements.Add(new CuiLabel
{
Text =
{
Text = "DeadLaugh Event",
FontSize = 16,
Align = TextAnchor.MiddleLeft
},
RectTransform =
{
AnchorMin = "0.025 0.0",
AnchorMax = "1.0 1.0"
}
}, "event_top");
foreach (EventPlayer player1 in EventPlayers)
{
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player1.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_top", null, null, null, null));
if(player1.inEvent){
if(!EventStarted){
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player1.player.net.connection }, null, "AddUI", new Facepunch.ObjectList(json1));
}
CuiHelper.AddUi(player1.player, elements);
}
}
if(activeCount() == 1 && EventStarted ){
startCelebration(getWinner());
}
}
*/
private void updateGUI(BasePlayer player)
{
// startCountdown();
if(elements != null){
elements = null;
}
elements = new CuiElementContainer();
string mainNameTemp = mainName;
if(!EventStarted){
json1 = @"[
{
""name"": ""event_blackout"",
""parent"": ""HUD/Overlay"",
""components"":
[
{
""type"":""UnityEngine.UI.RawImage"",
""imagetype"": ""Filled"",
""color"": ""1.0 1.0 1.0 1.0"",
""url"": ""http://rust.deadlaugh.com/overlay/dl2.png"",
""fadeIn"": ""1""
},
{
""type"":""RectTransform"",
""anchormin"": ""0.0 0.0"",
""anchormax"": ""1.0 1.0""
}
]
}
]
";
}
mainName = elements.Add(new CuiPanel
{
Image =
{
Color = "0.1 0.1 0.1 1"
},
RectTransform =
{
AnchorMin = "0.0 0.95",
AnchorMax = "1.0 1.0"
},
CursorEnabled = false
},"HUD/Overlay", "event_top");
elements.Add(new CuiLabel
{
Text =
{
Text = activeCount().ToString() + " Players Left.",
FontSize = 24,
Align = TextAnchor.MiddleCenter
},
RectTransform =
{
AnchorMin = "0.0 0.0",
AnchorMax = "1.0 1.0"
}
}, "event_top");
elements.Add(new CuiLabel
{
Text =
{
Text = "DeadLaugh Event",
FontSize = 16,
Align = TextAnchor.MiddleLeft
},
RectTransform =
{
AnchorMin = "0.025 0.0",
AnchorMax = "1.0 1.0"
}
}, "event_top");
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_top", null, null, null, null));
EventPlayer p = player.GetComponent<EventPlayer>();
if((p != null) && (p.inEvent)){ // add event_blackout once to each player
if(!EventStarted){
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player.net.connection }, null, "AddUI", new Facepunch.ObjectList(json1));
}
}
foreach (EventPlayer player1 in EventPlayers)
{
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = player1.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_top", null, null, null, null));
if(player1.inEvent){
CuiHelper.AddUi(player1.player, elements);
}
}
}
void startCelebration(BasePlayer player)
{
EventOpen = false;
EventStarted = false;
winnerFirst = player.displayName.ToString();
BroadcastToChat(string.Format(MessageEventWinner, winnerFirst));
BroadcastToChat(string.Format(MessageEventWinner2));
timer.Once(5, () => killWinner(player));
}
private void killWinner(BasePlayer player)
{
Vector3 direction = (Vector3.up).normalized;
Vector3 launchPos = player.transform.position;
BaseEntity rocket = CreateRocket(launchPos, direction, true);
}
static void PutToSleep(BasePlayer player)
{
if (!player.IsSleeping())
{
player.SetPlayerFlag(BasePlayer.PlayerFlags.Sleeping, true);
if (!BasePlayer.sleepingPlayerList.Contains(player))
{
BasePlayer.sleepingPlayerList.Add(player);
}
player.CancelInvoke("InventoryUpdate");
player.inventory.crafting.CancelAll(true);
}
}
void SaveInventory(BasePlayer player)
{
var eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
eventplayer.SaveInventory();
}
void SaveHomeLocation(BasePlayer player)
{
EventPlayer eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
eventplayer.SaveHome();
}
void RedeemInventory(BasePlayer player)
{
EventPlayer eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
if (player.IsDead() || player.health < 1)
return;
if (eventplayer.savedInventory)
{
eventplayer.player.inventory.Strip();
eventplayer.RestoreInventory();
}
}
void TeleportPlayerHome(BasePlayer player)
{
EventPlayer eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
if (player.IsDead() || player.health < 1)
return;
if (eventplayer.savedHome)
{
eventplayer.TeleportHome();
}
}
void TryErasePlayer(BasePlayer player)
{
var eventplayer = player.GetComponent<EventPlayer>();
if (eventplayer == null) return;
if (!(eventplayer.inEvent) && !(eventplayer.savedHome) && !(eventplayer.savedInventory))
GameObject.Destroy(eventplayer);
}
void GivePlayerKit(BasePlayer player, string GiveKit)
{
Kits.Call("GiveKit", player, GiveKit);
}
void EjectAllPlayers()
{
foreach (EventPlayer eventplayer in EventPlayers)
{
EjectPlayer(eventplayer.player);
// bugfix: event_blackout and event_top wasn't destroyed after typing /event_cancel
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = eventplayer.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_blackout", null, null, null, null));
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = eventplayer.player.net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_top", null, null, null, null));
eventplayer.inEvent = false;
}
}
void SendPlayersHome()
{
foreach (EventPlayer eventplayer in EventPlayers)
{
TeleportPlayerHome(eventplayer.player);
}
}
void RedeemPlayersInventory()
{
foreach (EventPlayer eventplayer in EventPlayers)
{
RedeemInventory(eventplayer.player);
}
}
void TryEraseAllPlayers()
{
foreach (EventPlayer eventplayer in EventPlayers)
{
TryErasePlayer(eventplayer.player);
}
}
void EjectPlayer(BasePlayer player)
{
if (player.IsAlive())
{
player.SetPlayerFlag(BasePlayer.PlayerFlags.Wounded, false);
player.CancelInvoke("WoundingEnd");
player.health = 100f;
player.metabolism.bleeding.value = 0f;
}
}
static void ForcePlayerPosition(BasePlayer player, Vector3 destination)
{
PutToSleep(player);
player.transform.position = destination;
lastPositionValue.SetValue(player, player.transform.position);
player.ClientRPCPlayer(null, player, "ForcePositionTo", new object[] { destination });
player.TransformChanged();
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
player.UpdateNetworkGroup();
player.SendNetworkUpdateImmediate(false);
player.ClientRPCPlayer(null, player, "StartLoading");
player.SendFullSnapshot();
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, false);
player.ClientRPCPlayer(null, player, "FinishLoading");
}
static void ForcePlayerPosition2(BasePlayer player, Vector3 destination)
{
//PutToSleep(player);
player.transform.position = destination;
lastPositionValue.SetValue(player, player.transform.position);
player.ClientRPCPlayer(null, player, "ForcePositionTo", new object[] { destination });
player.TransformChanged();
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
player.UpdateNetworkGroup();
player.SendNetworkUpdateImmediate(false);
//player.ClientRPCPlayer(null, player, "StartLoading");
player.SendFullSnapshot();
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, false);
// player.ClientRPCPlayer(null, player, "FinishLoading");
}
static void ForcePlayerPosition3(BasePlayer player, Vector3 destination)
{
player.transform.position = destination;
lastPositionValue.SetValue(player, player.transform.position);
}
void OnEntityDeath(BaseEntity entity, HitInfo hitinfo)
{
//if (!EventStarted) return;
if (!(entity is BasePlayer)) return;
if ((entity as BasePlayer).GetComponent<EventPlayer>() == null) return;
(entity as BasePlayer).GetComponent<EventPlayer>().inEvent = false;
(entity as BasePlayer).SetPlayerFlag(BasePlayer.PlayerFlags.VoiceMuted, false);
addBackSpawn((entity as BasePlayer));
if(EventStarted){
if(activeCount() == 2){
winnerThird = (entity as BasePlayer).displayName.ToString();
BroadcastToChat("Third Place: <color=red>" + winnerThird + "</color>");
}
if(activeCount() == 1){
winnerSecond = (entity as BasePlayer).displayName.ToString();
BroadcastToChat("Second Place: <color=red>" + winnerSecond + "</color>");
}
}
//updateGUI();
updateGUI(entity as BasePlayer);
if(activeCount() == 1 && EventStarted ){
startCelebration(getWinner());
}
CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo() { connection = (entity as BasePlayer).net.connection }, null, "DestroyUI", new Facepunch.ObjectList("event_blackout", null, null, null, null));
// BroadcastToChat((entity as BasePlayer).displayName.ToString());
return;
}
void OnPlayerDisconnected(BasePlayer player)
{
if (player.GetComponent<EventPlayer>() != null)
{
LeaveEvent(player);
BroadcastToChat(player.displayName + " disconnected, and has been removed from the event.");
}
}
void OnPlayerRespawned(BasePlayer player)
{
if (!(player.GetComponent<EventPlayer>())) return;
if (player.GetComponent<EventPlayer>().savedInventory || player.GetComponent<EventPlayer>().savedHome)
{
player.GetComponent<EventPlayer>().inEvent = false;
updateGUI(player);
RedeemInventory(player);
TeleportPlayerHome(player);
EventPlayers.Remove(player.GetCompone
// ... [Code preview truncated due to length. Full source in attached file] ...