C#:
using System;
using System.Collections.Generic;
using System.Collections;
using System.Linq;
using System.Globalization;
using System.Text;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Core.Libraries.Covalence;
using UnityEngine;
using Network;
using Facepunch;
using System.Text.RegularExpressions;
using ProtoBuf;
using Oxide.Game.Rust.Cui;
using static System.Math;
using Newtonsoft.Json;
using BTN = BUTTON;
using Oxide.Game.Rust;
using Oxide.Game.Rust.Libraries.Covalence;
namespace Oxide.Plugins {
[Info("UberTool", "FuJiCuRa", "1.4.0", ResourceId = 78)]
class UberTool : RustPlugin {
[PluginReference]
Plugin Clans;
StrdDt plyrPrfs = new StrdDt();
class StrdDt {
public Dictionary<ulong, Plyrnf> PlyData = new Dictionary<ulong, Plyrnf>();
public StrdDt() {
}
}
class Plyrnf {
public float SF;
public int DBG;
public Plyrnf() {
}
}
public class EPlanner : MonoBehaviour {
BasePlayer player;
InputState stt;
uint ctvtm;
Construction.Target target;
Construction.Target mvTrgt;
BaseEntity mvTrgtSnp;
Construction construction;
Construction mvCnstrctn;
Construction ryDfntn;
Vector3 rttnOffst;
Vector3 mvOffst;
string lstCrsshr;
string lstWrnng;
Planner plnnr;
bool sPlnnr;
bool sHmmr;
bool isWireTool;
HeldEntity hldItm;
bool sRmvr;
bool isAnotherHeld;
Item ctvtmLnk;
bool sTpDplybl;
int dfltGrd;
uint lstPrfb;
bool initialized;
bool ctvTrgt;
bool sPlcng;
float tkDist;
RaycastHit rayHit;
BaseEntity rayEntity;
IPlayer rayEntityOwner;
string rayEntityName;
Vector3 lastAimAngles;
Socket_Base lastSocketBase;
Vector3 lastSocketPos;
BaseEntity lastSocketEntity;
Construction.Placement lastPlacement;
Ray lastRay;
bool plannerInfoStatus;
bool removerInfoStatus;
bool hammerInfoStatus;
bool lastSocketForce;
int cuiFontSize = 14;
string cuiFontColor = "1 1 1 1";
string fontType = r("EbobgbPbaqrafrq-Erthyne.ggs");
float lastPosRotUpdate = 0f;
void Awake() {
player = GetComponent<BasePlayer>();
stt = player.serverInput;
UnEqp();
dfltGrd = uTs.plyrPrfs.PlyData[player.userID].DBG;
lstPrfb = 72949757u;
ctvtm = 0;
construction = new Construction();
ryDfntn = new Construction();
construction.canBypassBuildingPermission = true;
lastAimAngles = player.lastReceivedTick.inputState.aimAngles;
lastSocketBase = default(Socket_Base);
lastSocketPos = Vector3.zero;
lastSocketEntity = default(BaseEntity);
lastPlacement = default(Construction.Placement);
rayEntity = default(BaseEntity);
rttnOffst = Vector3.zero;
mvOffst = Vector3.zero;
}
void Start() {
if (uTs.hideTips) player.SendConsoleCommand(r("tnzrgvc.uvqrtnzrgvc"));
initialized = true;
}
void UnEqp() {
foreach (var item in player.inventory.containerBelt.itemList.Where(x => x.IsValid() && x.GetHeldEntity()).ToList()) {
var slot = item.position;
if ((item.info.shortname == "rock" && item.skin == 0uL) || item.info.shortname == "torch") {
item.Remove(0f);
continue;
}
else item.RemoveFromContainer();
player.inventory.UpdateContainer(0f, PlayerInventory.Type.Belt, player.inventory.containerBelt, false, 0f);
uTs.timer.Once(0.15f, () => {
if (item == null) return;
item.MoveToContainer(player.inventory.containerBelt, slot, true);
item.MarkDirty();
}
);
ItemManager.DoRemoves();
}
if (player.inventory.containerWear.itemList.Count == 0) {
var hz = ItemManager.CreateByName("hazmatsuit_scientist", 1);
player.inventory.GiveItem(hz, player.inventory.containerWear);
}
uTs.timer.Once(0.3f, CrtTls);
}
void GetTool(object[] tool) {
var itemDef = ItemManager.FindItemDefinition((string)tool[1]);
if (!itemDef) return;
var p1 = player.inventory.FindItemID(itemDef.itemid);
ulong skin = Convert.ToUInt64(tool[2]);
if (p1 != null) {
p1.skin = skin;
p1.GetHeldEntity().skinID = skin;
p1.name = (string)tool[0];
if (p1.CanMoveTo(player.inventory.containerBelt, -1, true)) {
p1.MoveToContainer(player.inventory.containerBelt, -1, true);
p1.MarkDirty();
}
}
else {
var p2 = ItemManager.CreateByItemID(itemDef.itemid, 1, skin);
if (p2 != null) {
p2.name = (string)tool[0];
player.inventory.GiveItem(p2, player.inventory.containerBelt);
p2.MarkDirty();
}
}
}
void CrtTls() {
if (uTs.crtTlPlnnr) GetTool(uTs.playerTools[0]);
if (uTs.crtTlRmvr) GetTool(uTs.playerTools[1]);
if (uTs.crtTlHmmr) GetTool(uTs.playerTools[2]);
}
bool GtCrrntTl() {
sPlnnr = false;
sRmvr = false;
sHmmr = false;
isWireTool = false;
isAnotherHeld = false;
DestroyInfo();
if (hldItm is Planner) {
plnnr = hldItm as Planner;
sPlnnr = true;
sTpDplybl = plnnr.isTypeDeployable;
DoPlannerInfo();
return true;
}
else if (hldItm is BaseProjectile && ctvtmLnk.skin == Convert.ToUInt64(uTs.playerTools[1][2])) {
sRmvr = true;
return true;
}
else if (hldItm is Hammer && ctvtmLnk.skin == Convert.ToUInt64(uTs.playerTools[2][2])) {
sHmmr = true;
DoHammerInfo();
return true;
}
else if (hldItm is AttackEntity) {
isAnotherHeld = true;
return true;
}
else if (hldItm is WireTool) {
isWireTool = true;
return true;
}
return false;
}
void ChkRmvr() {
bool hsLsr = false;
if (ctvtmLnk.info.shortname != (string)uTs.playerTools[1][1]) {
sRmvr = false;
hldItm = null;
return;
}
ctvtmLnk.contents.flags = (ItemContainer.Flag)64;
ctvtmLnk.contents.MarkDirty();
if (ctvtmLnk.contents != null && ctvtmLnk.contents.itemList.Count > 0) foreach (var mod in ctvtmLnk.contents.itemList) if (mod.info.shortname == r("jrncba.zbq.ynfrefvtug")) {
hsLsr = true;
break;
}
if (!hsLsr) {
var lMod = ItemManager.CreateByName(r("jrncba.zbq.ynfrefvtug"), 1);
if (lMod != null) if(lMod.MoveToContainer(ctvtmLnk.contents, -1, true)) hsLsr = true;
else {
sRmvr = false;
hldItm = null;
return;
}
}
(hldItm as BaseProjectile).UnloadAmmo(ctvtmLnk, player);
hldItm.SetLightsOn(true);
DoRemoverInfo();
}
public void StHldItm(uint uid) {
if (!initialized || uid == ctvtm) return;
if (uid == 0u) {
ctvtm = 0u;
sPlnnr = false;
sRmvr = false;
sHmmr = false;
isWireTool = false;
sTpDplybl = false;
construction = null;
DestroyInfo();
return;
}
if (uid != ctvtm) {
ctvtmLnk = player.inventory.containerBelt.FindItemByUID(uid);
if (ctvtmLnk == null) return;
ctvtm = uid;
hldItm = ctvtmLnk.GetHeldEntity() as HeldEntity;
if (hldItm == null) return;
if (!GtCrrntTl()) return;
if (sRmvr) {
CuiHelper.DestroyUi(player, r("HgPebffUnveHV"));
ChkRmvr();
}
else if (sPlnnr || sHmmr) {
construction = PrefabAttribute.server.Find<Construction>(sPlnnr && sTpDplybl && plnnr.GetDeployable() != null ? plnnr.GetDeployable().prefabID : lstPrfb);
rttnOffst = Vector3.zero;
if (sPlnnr) {
if (sTpDplybl) DPlnnrUpdt(PType.Mode, ctvtmLnk.info.displayName.english);
else DPlnnrUpdt(PType.Mode, $"{construction.info.name.english} ({((BuildingGrade.Enum)dfltGrd).ToString()})");
}
else DPlnnrUpdt(PType.Mode);
}
}
}
public void TckUpd(PlayerTick tick) {
if (!initialized) return;
bool changedInput = tick.inputState.aimAngles != lastAimAngles || tick.inputState.buttons != stt.previous.buttons || lastSocketForce;
if (lastSocketForce) lastSocketForce = false;
if (changedInput && !ctvTrgt) {
rayHit = default(RaycastHit);
lastAimAngles = tick.inputState.aimAngles;
int layer = sRmvr && uTs.rmvrTlbjcts ? 1143089921 : 2097921;
float range = 24f;
if (sRmvr) range = uTs.rmvrTlDstnc;
else if (sHmmr) range = uTs.hmmrTlDstnc;
lastRay = new Ray(tick.position + new Vector3(0f, 1.5f, 0f), Quaternion.Euler(tick.inputState.aimAngles) * Vector3.forward);
if (UnityEngine.Physics.Raycast(lastRay, out rayHit, range, layer, QueryTriggerInteraction.Ignore)) {
var ent = rayHit.GetEntity();
if (ent != null && ent != rayEntity) {
rayEntity = ent;
ryDfntn = PrefabAttribute.server.Find<Construction>(rayEntity.prefabID);
if (rayEntity.OwnerID > 0uL) rayEntityOwner = uTs.covalence.Players.FindPlayerById(rayEntity.OwnerID.ToString());
else rayEntityOwner = null;
rayEntityName = "";
if (ryDfntn) rayEntityName = ryDfntn.info.name.english;
if (rayEntityName.Length == 0) {
if (rayEntity is BaseCombatEntity) {
rayEntityName = (rayEntity as BaseCombatEntity).repair.itemTarget?.displayName.english;
if (rayEntityName == null || rayEntityName.Length == 0) rayEntityName = rayEntity.ShortPrefabName;
}
else rayEntityName = rayEntity.ShortPrefabName;
}
if (ryDfntn == null && (rayEntity.PrefabName.EndsWith("static.prefab") || rayEntity.PrefabName.Contains("/deployable/"))) {
ryDfntn = new Construction();
ryDfntn.rotationAmount = new Vector3(0, 90f, 0);
ryDfntn.fullName = rayEntity.PrefabName;
ryDfntn.maxplaceDistance = 8f;
}
}
else if(ent == null) {
rayEntity = null;
ryDfntn = null;
rayEntityOwner = null;
rayEntityName = "";
}
}
else {
rayEntity = null;
ryDfntn = null;
rayEntityOwner = null;
rayEntityName = "";
}
if (sPlnnr) {
if (lstWrnng != string.Empty) DoWarning(string.Empty, true);
target = default(Construction.Target);
target.player = player;
target.ray = lastRay;
ChkPlcmnt(ref target, construction);
if (target.socket != null && (target.socket != lastSocketBase || target.entity != lastSocketEntity || lastSocketForce)) {
if (lastSocketForce) lastSocketForce = false;
bool chEnt = false;
if (uTs.adEffctFndtnsPlcmnt && construction.hierachyName.Contains("foundation") && lastSocketEntity != target.entity) {
chEnt = true;
SendEffectTo(3951505782, target.entity, player);
}
lastSocketEntity = target.entity;
string name = target.entity.ShortPrefabName;
if (target.entity is BuildingBlock) DPlnnrUpdt(PType.ConnectTo, $"{rayEntityName} [{target.entity.net.ID}] ({(target.entity as BuildingBlock).currentGrade.gradeBase.type.ToString()})");
else DPlnnrUpdt(PType.ConnectTo, $"{rayEntityName} [{target.entity.net.ID}]");
if (uTs.adEffctFndtnsPlcmnt && !chEnt && construction.hierachyName.Contains("foundation") && lastSocketBase != target.socket) SendEffectTo(3389733993, target.entity, player);
lastSocketBase = target.socket;
lastSocketPos = lastSocketEntity.transform.localToWorldMatrix.MultiplyPoint3x4(lastSocketBase.position);
var s1 = lastSocketBase.socketName.Replace($"{target.entity.ShortPrefabName}/sockets/", "").TrimEnd('/', '1', '2', '3', '4').Replace("-", " ").Replace("–", " ");
DPlnnrUpdt(PType.ToSocket, $"{Oxide.Core.ExtensionMethods.TitleCase(s1)}");
lastPlacement = ChckPlcmnt(target, construction);
if (lastPlacement != null) DPlnnrUpdt(PType.PosRot, $"{lastPlacement.position.ToString("N1")} | {lastPlacement.rotation.eulerAngles.y.ToString("N1")}°");
else DPlnnrUpdt(PType.PosRot);
}
if (sTpDplybl) {
lastPlacement = ChckPlcmnt(target, construction);
if (lastPlacement != null) {
DPlnnrUpdt(PType.PosRot, $"{lastPlacement.position.ToString("N1")} | {lastPlacement.rotation.eulerAngles.ToString("N1")}");
DPlnnrUpdt(PType.ToSocket, "Terrain");
if (rayEntity) DPlnnrUpdt(PType.ConnectTo, $"{rayEntityName} [{rayEntity.net.ID}]");
}
else {
DPlnnrUpdt(PType.ToSocket);
DPlnnrUpdt(PType.ConnectTo);
DPlnnrUpdt(PType.PosRot);
}
}
if (!sTpDplybl && !target.socket) {
lastSocketBase = default(Socket_Base);
lastSocketEntity = default(BaseEntity);
DPlnnrUpdt(PType.ConnectTo);
DPlnnrUpdt(PType.PosRot);
DPlnnrUpdt(PType.ToSocket);
}
}
else if (sHmmr) {
if (lstWrnng != string.Empty) DoWarning(string.Empty, true);
if (!ctvTrgt) {
if (rayEntity && rayHit.distance <= uTs.hmmrTlDstnc) {
if (ryDfntn && rayEntity is BuildingBlock) {
DHmmrUpdt(HType.Target, $"{rayEntityName} [{rayEntity.net.ID}] ({(rayEntity as BuildingBlock).currentGrade.gradeBase.type.ToString()})");
DoCrosshair("0 1 0 0.75");
}
else if (ryDfntn) {
if(ryDfntn.fullName == StringPool.Get(3424003500)) {
DHmmrUpdt(HType.Target, $"{rayEntityName} [{rayEntity.net.ID}] (Type: {(rayEntity as MiningQuarry).staticType})");
}
else DHmmrUpdt(HType.Target, $"{rayEntityName} [{rayEntity.net.ID}]");
DoCrosshair("1 0.921568632 0.0156862754 0.75");
}
else {
DHmmrUpdt(HType.Target, $"{rayEntityName} [{rayEntity.net.ID}]");
}
DHmmrUpdt(HType.Mode, "Modify");
DHmmrUpdt(HType.Building, rayEntity is DecayEntity ? $"ID {(rayEntity as DecayEntity).buildingID}" : "None");
if (ryDfntn) {
float currentTime = UnityEngine.Time.realtimeSinceStartup;
if (currentTime - lastPosRotUpdate >= 0.25f) {
if (rayEntity is BuildingBlock) DHmmrUpdt(HType.PosRot, $"{rayEntity.transform.position.ToString("N1")} | {rayEntity.transform.rotation.eulerAngles.y.ToString("N1")}°");
else DHmmrUpdt(HType.PosRot, $"{rayEntity.transform.position.ToString("N1")} | {rayEntity.transform.rotation.eulerAngles.ToString("N1")}");
lastPosRotUpdate = currentTime;
}
if (rayEntityOwner != null) DHmmrUpdt(HType.Owner, $"{rayEntityOwner.Name}");
else DHmmrUpdt(HType.Owner, $"{rayEntity.OwnerID}");
}
}
else {
DHmmrUpdt(HType.Target);
DHmmrUpdt(HType.Building);
DHmmrUpdt(HType.Mode, r("Zbqvsl"));
DHmmrUpdt(HType.PosRot);
DHmmrUpdt(HType.Owner);
DoCrosshair("1 1 1 0.75");
}
}
else {
DHmmrUpdt(HType.PosRot, $"{mvTrgt.entity.transform.position.ToString("N1")} | {mvTrgt.entity.transform.rotation.eulerAngles.ToString("N1")}");
DoCrosshair(string.Empty);
}
}
else if (sRmvr) {
DoCrosshair(string.Empty);
if (rayEntity != null && rayHit.distance <= uTs.rmvrTlDstnc && (ryDfntn || (!ryDfntn && uTs.rmvrTlbjcts))) {
DRmvrUpdt(RType.Remove, $"{rayEntityName} [{rayEntity.net.ID}]");
if (rayEntityOwner != null) DRmvrUpdt(RType.Owner, $"{rayEntityOwner.Name}");
else DRmvrUpdt(RType.Owner, $"{rayEntity.OwnerID}");
}
else {
DRmvrUpdt(RType.Remove);
DRmvrUpdt(RType.Owner);
}
if (uTs.enblFllBldngRmvl && stt.IsDown(controlButtons[CmdType.RemoverHoldForAll]) && rayEntity is BuildingBlock) {
DoWarning("1 0 0 0.75");
DRmvrUpdt(RType.Mode, "<color=#ffff00>Building</color>");
}
else {
DRmvrUpdt(RType.Mode, r("Fvatyr"));
DoWarning(string.Empty);
}
}
else if (isAnotherHeld) {
if (hldItm is BaseLiquidVessel && (stt.WasJustReleased((BTN)1024) || stt.WasDown((BTN)2048))) {
var vessel = hldItm as BaseLiquidVessel;
if (vessel.AmountHeld() < 1) vessel.AddLiquid(ItemManager.FindItemDefinition("water"), vessel.MaxHoldable());
}
else if (hldItm is BaseProjectile && stt.WasJustPressed((BTN)8192)) {
var weapon = hldItm as BaseProjectile;
if (!weapon.primaryMagazine.CanReload(player) && weapon.primaryMagazine.contents < weapon.primaryMagazine.capacity) {
try {
player.inventory.GiveItem(ItemManager.Create(weapon.primaryMagazine.ammoType, weapon.primaryMagazine.capacity - weapon.primaryMagazine.contents));
}
catch {
}
ItemManager.DoRemoves();
}
}
else if (hldItm is FlameThrower && (stt.WasJustPressed((BTN)8192) || stt.IsDown((BTN)1024))) {
var flame = hldItm as FlameThrower;
if ((stt.IsDown((BTN)1024) && flame.ammo < 2) || (stt.WasJustPressed((BTN)8192) && flame.ammo < flame.maxAmmo)) {
flame.ammo = flame.maxAmmo;
flame.SendNetworkUpdateImmediate(false);
ItemManager.DoRemoves();
player.inventory.ServerUpdate(0f);
}
}
else if (hldItm is Chainsaw && (stt.WasJustPressed((BTN)8192) || stt.IsDown((BTN)1024) || stt.WasJustPressed((BTN)2048))) {
var saw = hldItm as Chainsaw;
if ((stt.WasJustPressed((BTN)2048) && !saw.EngineOn())) {
saw.SetEngineStatus(true);
hldItm.SendNetworkUpdateImmediate(false);
}
else if ((stt.IsDown((BTN)1024) && saw.ammo < 2) || (stt.WasJustPressed((BTN)8192) && saw.ammo < saw.maxAmmo)) {
saw.ammo = saw.maxAmmo;
saw.SendNetworkUpdateImmediate(false);
ItemManager.DoRemoves();
player.inventory.ServerUpdate(0f);
}
}
}
else if (isWireTool) {
}
}
else if (changedInput && ctvTrgt) {
DHmmrUpdt(HType.PosRot, $"{mvTrgt.entity.transform.position.ToString("N1")} | {mvTrgt.entity.transform.rotation.eulerAngles.ToString("N1")}");
DoCrosshair(string.Empty, true);
}
if (sPlnnr && !sTpDplybl) {
if (lastSocketBase != null && lastPlacement != null && lastSocketEntity) {
OBB oBB = new OBB(lastPlacement.position, Vector3.one, lastPlacement.rotation, construction.bounds);
Vector3 obb_pos = construction.hierachyName.Contains(r("sbhaqngvba")) ? oBB.position + (oBB.extents.y * Vector3.up) : oBB.position;
Vector3 sock_pos = construction.hierachyName.Contains(r("sbhaqngvba")) ? new Vector3 (lastSocketPos.x, lastSocketEntity.transform.position.y, lastSocketPos.z) : lastSocketPos;
player.SendConsoleCommand("ddraw.box", 0.05f, Color.green, obb_pos, 0.15f);
player.SendConsoleCommand("ddraw.box", 0.05f, Color.green, sock_pos, 0.25f);
player.SendConsoleCommand("ddraw.line", 0.05f, Color.green, obb_pos, sock_pos);
}
}
}
void Update() {
if (!ctvTrgt) return;
if (!sPlcng && sHmmr) {
if (mvTrgt.entity == null) {
DoCrosshair("1 1 1 0.75");
mvTrgt = default(Construction.Target);
sPlcng = false;
ctvTrgt = false;
return;
}
bool flag = mvTrgt.entity is SimpleBuildingBlock || mvCnstrctn.allSockets == null;
mvTrgt.ray = player.eyes.BodyRay();
FndTrrnPlcmnt(ref mvTrgt, mvCnstrctn, tkDist, flag);
Vector3 position = mvTrgt.entity.transform.position;
Quaternion rotation = mvTrgt.entity.transform.rotation;
Vector3 toPos = mvTrgt.position;
Quaternion toRot = Quaternion.LookRotation(mvTrgt.entity.transform.up) * Quaternion.Euler(mvOffst);
if (flag) {
Vector3 direction = mvTrgt.ray.direction;
direction.y = 0f;
direction.Normalize();
toRot = Quaternion.Euler(mvOffst) * Quaternion.LookRotation(direction, Vector3.up);
}
var check = ChckPlcmnt(mvTrgt, mvCnstrctn);
if (check != null) {
toPos = check.position;
toRot = check.rotation * Quaternion.Euler(mvOffst);
}
mvTrgt.entity.transform.position = Vector3.Lerp(position, toPos, UnityEngine.Time.deltaTime * 5f);
mvTrgt.entity.transform.rotation = Quaternion.Lerp(rotation, toRot, UnityEngine.Time.deltaTime * 10f);
DMvmntSnc(mvTrgt.entity);
return;
}
else if (sPlcng) {
if (mvTrgt.entity == null) {
DoCrosshair("1 1 1 0.75");
mvTrgt = default(Construction.Target);
sPlcng = false;
ctvTrgt = false;
return;
}
if (Vector3.Distance(mvTrgt.entity.transform.position, mvTrgt.position) <= 0.005f) {
if (mvTrgtSnp && !(mvTrgtSnp is BuildingBlock)) {
mvTrgt.entity.transform.position = mvTrgtSnp.transform.InverseTransformPoint(mvTrgt.position);
mvTrgt.entity.transform.rotation = Quaternion.Inverse(mvTrgtSnp.transform.rotation) * Quaternion.Euler(mvTrgt.rotation);
mvTrgt.entity.SetParent(mvTrgtSnp, 0u);
}
if (mvTrgtSnp) {
DecayUpdate(mvTrgt.entity, true, mvCnstrctn.isBuildingPrivilege, mvTrgtSnp);
mvTrgtSnp = null;
}
DMvmntSnc(mvTrgt.entity);
DoCrosshair("1 1 1 0.75");
mvTrgt = default(Construction.Target);
sPlcng = false;
ctvTrgt = false;
return;
}
mvTrgt.entity.transform.position = Vector3.Lerp(mvTrgt.entity.transform.position, mvTrgt.position, UnityEngine.Time.deltaTime * 10f);
if (mvTrgtSnp == null || (mvTrgtSnp && !(mvTrgtSnp is BuildingBlock))) mvTrgt.entity.transform.rotation = Quaternion.Lerp(mvTrgt.entity.transform.rotation, Quaternion.Euler(mvTrgt.rotation), UnityEngine.Time.deltaTime * 10f);
DMvmntSnc(mvTrgt.entity);
return;
}
else if (!sPlcng && !sHmmr) {
if (mvTrgt.valid) PlcOnTrgt();
else TrPlcTrgt();
}
}
void DecayUpdate(BaseEntity entity, bool isAdding, bool isBuildingPrivilege, BaseEntity target = null) {
DecayEntity dcEnt = entity as DecayEntity;
if (dcEnt == null) return;
BuildingManager.Building building = null;
if (isAdding) {
DecayEntity dcTgt = target != null ? target as DecayEntity : null;
if (dcTgt != null) building = BuildingManager.server.GetBuilding(dcTgt.buildingID);
if (building != null) {
building.AddDecayEntity(dcEnt);
if (isBuildingPrivilege) building.AddBuildingPrivilege(dcEnt as BuildingPrivlidge);
building.Dirty();
dcEnt.buildingID = building.ID;
}
}
else {
building = BuildingManager.server.GetBuilding(dcEnt.buildingID);
if (building != null) {
if (building.decayEntities != null) building.RemoveDecayEntity(dcEnt);
if (isBuildingPrivilege && building.buildingPrivileges != null) building.RemoveBuildingPrivilege(dcEnt as BuildingPrivlidge);
building.Dirty();
}
dcEnt.buildingID = 0u;
}
dcEnt.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
if (entity.children != null) foreach (BaseEntity current in entity.children) DecayUpdate(current, isAdding, isBuildingPrivilege, isAdding ? entity : null);
}
void PlcOnTrgt() {
if (mvTrgtSnp && !(mvTrgtSnp is BuildingBlock)) {
mvTrgt.entity.transform.position = mvTrgtSnp.transform.worldToLocalMatrix.MultiplyPoint3x4(mvTrgt.position);
mvTrgt.entity.transform.rotation = Quaternion.Inverse(mvTrgtSnp.transform.rotation) * mvTrgt.entity.transform.rotation;
mvTrgt.entity.SetParent(mvTrgtSnp, 0u);
}
if (mvTrgtSnp) {
DecayUpdate(mvTrgt.entity, true, mvCnstrctn.isBuildingPrivilege, mvTrgtSnp);
mvTrgtSnp = null;
}
DMvmntSnc(mvTrgt.entity);
mvTrgt = default(Construction.Target);
ctvTrgt = false;
sPlcng = false;
}
void TrPlcTrgt() {
RaycastHit hit;
mvTrgtSnp = null;
int layer = mvCnstrctn.isBuildingPrivilege ? 2097152 : 27328769;
if (Physics.Raycast(mvTrgt.entity.transform.position, mvTrgt.entity.transform.up * -1.0f, out hit, float.PositiveInfinity, layer)) {
mvTrgt.position = hit.point;
if (hit.collider is UnityEngine.TerrainCollider) {
mvTrgt.rotation = Quaternion.LookRotation(Vector3.Cross(mvTrgt.entity.transform.right, hit.normal)).eulerAngles;
DHmmrUpdt(HType.Building, "None");
}
else {
mvTrgtSnp = hit.GetEntity();
if (mvTrgtSnp) {
mvTrgt.rotation = mvTrgt.entity.transform.rotation.eulerAngles;
DHmmrUpdt(HType.Building, rayEntity is DecayEntity ? $"ID {(rayEntity as DecayEntity).buildingID}" : "None");
}
else DHmmrUpdt(HType.Building, "None");
}
sPlcng = true;
return;
}
else {
mvTrgt = default(Construction.Target);
ctvTrgt = false;
sPlcng = false;
return;
}
}
public object GtMvTrgt() {
if (ctvTrgt && mvTrgt.entity != null) return (uint)mvTrgt.entity.net.ID;
return null;
}
void DMvmntSnc(BaseEntity entity, bool isChild = false) {
if (entity == null) {
DoCrosshair("1 1 1 0.75");
mvTrgt = default(Construction.Target);
sPlcng = false;
ctvTrgt = false;
return;
}
bool force2 = entity.PrefabName == StringPool.Get(2206646561) || entity.PrefabName == StringPool.Get(2335812770);
if (isChild || force2) {
if (Net.sv.write.Start()) {
Net.sv.write.PacketID(Message.Type.EntityDestroy);
Net.sv.write.UInt32(entity.net.ID);
Net.sv.write.UInt8(0);
Net.sv.write.Send(new SendInfo(entity.net.group.subscribers));
}
entity.SendNetworkUpdateImmediate(false);
if (isChild) return;
}
else {
if (Net.sv.write.Start()) {
Net.sv.write.PacketID(Message.Type.GroupChange);
Net.sv.write.EntityID(entity.net.ID);
Net.sv.write.GroupID(entity.net.group.ID);
Net.sv.write.Send(new SendInfo(entity.net.group.subscribers));
}
if (Net.sv.write.Start()) {
Net.sv.write.PacketID(Message.Type.EntityPosition);
Net.sv.write.EntityID(entity.net.ID);
Net.sv.write.Vector3(entity.GetNetworkPosition());
Net.sv.write.Vector3(entity.GetNetworkRotation().eulerAngles);
Net.sv.write.Float(entity.GetNetworkTime());
Write write = Net.sv.write;
SendInfo info = new SendInfo(entity.net.group.subscribers);
info.method = SendMethod.ReliableUnordered;
info.priority = Priority.Immediate;
write.Send(info);
}
}
if (force2 && entity && entity.children != null) foreach (BaseEntity current in entity.children) DMvmntSnc(current, true);
}
public void DoTi() {
if (!initialized || !hldItm) return;
if (sPlnnr) {
if (true) {
if (stt.WasJustPressed(controlButtons[CmdType.PlannerPlace])) {
DoPl();
return;
}
else if (stt.WasJustPressed(controlButtons[CmdType.PlannerRotate])) {
Vector3 vector = Vector3.zero;
if (construction && construction.canRotate) vector = construction.rotationAmount;
rttnOffst.x = Mathf.Repeat(rttnOffst.x + vector.x, 360f);
rttnOffst.y = Mathf.Repeat(rttnOffst.y + vector.y, 360f);
rttnOffst.z = Mathf.Repeat(rttnOffst.z + vector.z, 360f);
return;
}
}
if (!sTpDplybl) {
if (stt.WasJustPressed((BTN)2048)) {
BldMnUI(uTs.plyrPrfs.PlyData[player.userID].SF);
return;
}
else if (stt.IsDown(controlButtons[CmdType.PlannerTierChange])) {
if (stt.WasJustPressed(controlButtons[CmdType.PlannerTierNext])) {
dfltGrd++;
if (dfltGrd > 4) dfltGrd = 0;
uTs.plyrPrfs.PlyData[player.userID].DBG = dfltGrd;
DPlnnrUpdt(PType.Mode, $"{construction.info.name.english} ({((BuildingGrade.Enum)dfltGrd).ToString()})");
return;
}
else if (stt.WasJustPressed(controlButtons[CmdType.PlannerTierPrev])) {
dfltGrd--;
if (dfltGrd < 0) dfltGrd = 4;
uTs.plyrPrfs.PlyData[player.userID].DBG = dfltGrd;
DPlnnrUpdt(PType.Mode, $"{construction.info.name.english} ({((BuildingGrade.Enum)dfltGrd).ToString()})");
return;
}
}
}
else if (sTpDplybl) {
}
}
else if (sHmmr) {
if (ctvTrgt) {
if (sPlcng) {
}
else if (!sPlcng) {
if (stt.WasJustPressed(controlButtons[CmdType.HammerTransform])) {
if (mvTrgt.valid) PlcOnTrgt();
else TrPlcTrgt();
return;
}
else if (stt.WasJustPressed(controlButtons[CmdType.HammerRotate])) {
Vector3 vector = Vector3.zero;
if (mvCnstrctn && mvCnstrctn.canRotate) {
if (stt.IsDown(controlButtons[CmdType.HammerRotateDirection])) vector =- mvCnstrctn.rotationAmount;
else vector = mvCnstrctn.rotationAmount;
}
mvOffst.x = Mathf.Repeat(mvOffst.x + vector.x, 360f);
mvOffst.y = Mathf.Repeat(mvOffst.y + vector.y, 360f);
mvOffst.z = Mathf.Repeat(mvOffst.z + vector.z, 360f);
return;
}
}
}
else if (!ctvTrgt) {
if (stt.WasJustPressed(controlButtons[CmdType.HammerChangeGrade]) && rayEntity && rayEntity.IsValid() && rayEntity is BuildingBlock) {
BuildingBlock block = rayEntity as BuildingBlock;
var grade = (int)block.currentGrade.gradeBase.type;
grade++;
if (grade >= block.blockDefinition.grades.Length) grade = 1;
block.SetGrade((BuildingGrade.Enum)grade);
block.SetHealthToMax();
block.StartBeingRotatable();
rayEntity.SendNetworkUpdate(BasePlayer.NetworkQueue.Update);
block.UpdateSkin(false);
BuildingManager.Building building = BuildingManager.server.GetBuilding(block.buildingID);
if (building != null) building.Dirty();
if (uTs.ffctPrmtngBlcksOn) Effect.server.Run("assets/bundled/prefabs/fx/build/promote_" + ((BuildingGrade.Enum)grade).ToString().ToLower() + ".prefab", rayEntity, 0u, Vector3.zero, Vector3.zero, null, false);
}
else if (stt.WasJustPressed(controlButtons[CmdType.HammerToggleOnOff]) && rayEntity && rayEntity.IsValid() && !(rayEntity is BuildingBlock)) {
var r = rayEntity;
if (r is StorageContainer || r is IOEntity) {
bool isOn = r.HasFlag(BaseEntity.Flags.On);
bool hasPower = isOn & r is IOEntity;
if (r is SearchLight && !isOn) (r as SearchLight).secondsRemaining = float.PositiveInfinity;
r.SetFlag(BaseEntity.Flags.On, !isOn, false);
if(r is IOEntity) r.SetFlag(BaseEntity.Flags.Reserved8, !hasPower, false);
r.SendNetworkUpdate();
return;
}
else if (r is MiningQuarry) {
var q = r as MiningQuarry;
q.staticType = (MiningQuarry.QuarryType)(int)q.staticType+1;
if ((int)q.staticType > 3) q.staticType = (MiningQuarry.QuarryType)0;
q.UpdateStaticDeposit();
}
else if(r is EngineSwitch) {
var miningQuarry = r.GetParentEntity() as MiningQuarry;
if (miningQuarry) miningQuarry.EngineSwitch(true);
}
}
else if (stt.WasJustPressed(controlButtons[CmdType.HammerRotate])) {
if (!rayEntity || !rayEntity.IsValid() || ryDfntn == null || ryDfntn.rotationAmount.y == 0f) return;
string effectPath = ryDfntn.deployable != null && ryDfntn.deployable.placeEffect.isValid ? ryDfntn.deployable.placeEffect.resourcePath : StringPool.Get(2598153373);
if (stt.IsDown(controlButtons[CmdType.HammerRotateDirection])) rayEntity.transform.Rotate(-ryDfntn.rotationAmount);
else rayEntity.transform.Rotate(ryDfntn.rotationAmount);
if (rayEntity is StabilityEntity) {
rayEntity.RefreshEntityLinks();
if (!uTs.vrrdStbltWhlBld && !(rayEntity as StabilityEntity).grounded) (rayEntity as StabilityEntity).UpdateSurroundingEntities();
if (rayEntity is BuildingBlock) {
var conskin = rayEntity.gameObject.GetComponentInChildren<ConstructionSkin>();
if (conskin) conskin.Refresh(rayEntity as BuildingBlock);
rayEntity.ClientRPC(null, r("ErserfuFxva"));
}
}
DMvmntSnc(rayEntity);
Effect.server.Run(effectPath, rayEntity, 0u, Vector3.zero, Vector3.zero, null, false);
}
else if (stt.WasJustPressed(controlButtons[CmdType.HammerTransform])) {
if (mvTrgt.entity != null) {
mvTrgt = default(Construction.Target);
ctvTrgt = false;
sPlcng = false;
return;
}
if (!rayEntity || rayEntity is BuildingBlock || rayEntity.FindLinkedEntity<BuildingBlock>()) return;
if (rayEntity is BaseMountable && (rayEntity as BaseMountable)._mounted != null) return;
mvCnstrctn = PrefabAttribute.server.Find<Construction>(rayEntity.prefabID);
if (mvCnstrctn == null) {
if (!rayEntity.PrefabName.EndsWith("static.prefab") && !rayEntity.PrefabName.Contains("/deployable/")) return;
mvCnstrctn = new Construction();
mvCnstrctn.rotationAmount = new Vector3(0, 90f, 0);
mvCnstrctn.fullName = rayEntity.PrefabName;
mvCnstrctn.maxplaceDistance = rayEntity is MiningQuarry ? 8f : 4f;
mvCnstrctn.canRotate = true;
}
if (rayEntity is DecayEntity) {
DecayUpdate(rayEntity, false, mvCnstrctn.isBuildingPrivilege);
DHmmrUpdt(HType.Building, "None");
}
mvTrgt = default(Construction.Target);
mvOffst = Vector3.zero;
if (rayEntity.HasParent()) {
var position = rayEntity.transform.position;
var rotation = rayEntity.transform.rotation;
rayEntity.SetParent(null, 0u);
rayEntity.transform.position = position;
rayEntity.transform.rotation = rotation;
DMvmntSnc(rayEntity);
}
if (rayEntity.children.Count == 0 || !rayEntity.HasParent()) {
DMvmntSnc(rayEntity);
}
tkDist = Mathf.Clamp(Vector3.Distance(rayEntity.transform.position, lastRay.origin), mvCnstrctn.maxplaceDistance, mvCnstrctn.maxplaceDistance * 3f);
mvTrgt.entity = rayEntity;
sPlcng = false;
ctvTrgt = true;
DHmmrUpdt(HType.Mode, r("Ercbfvgvbavat"));
}
else if (stt.WasJustPressed(controlButtons[CmdType.HammerAuthInfo]) && !stt.WasDown(controlButtons[CmdType.HammerTransform]) && (uTs.nblHmmrTcInf || uTs.nblHmmrLckInf)) {
string infoMsg = "";
if (uTs.nblHmmrTcInf && rayEntity && rayEntity is BuildingPrivlidge && rayEntity.Distance(player.transform.position) > 1.25f) {
var hasClans = uTs.Clans != null ? true : false;
var sb = new StringBuilder(
// ... [Code preview truncated due to length. Full source in attached file] ...