delete everything after line 300 then paste the following. fixed by AI
if (forceResetHostileTimer)
{
player.State.unHostileTimestamp = 0;
player.ClientRPCPlayer(null, player, "SetHostileLength", 0f);
}
if (town == "outpost")
{
Teleport(player, OutpostSpawns[new System.Random().Next(OutpostSpawns.Count)]);
}
else if (town == "bandit")
{
Teleport(player, BanditSpawns[new System.Random().Next(BanditSpawns.Count)]);
}
int currentTime = GetUnix();
if (!storedData.Cooldowns.ContainsKey(player.userID))
{
storedData.Cooldowns.Add(player.userID, currentTime);
}
else
{
storedData.Cooldowns[player.userID] = currentTime;
}
SaveData();
if (TeleportTimers.ContainsKey(player))
{
TeleportTimers[player]?.Destroy();
TeleportTimers.Remove(player);
}
player.ChatMessage(Lang("TeleportSuccessMessage", player.UserIDString));
});
}
private void CmdCancelTp(BasePlayer player)
{
if (permission.UserHasPermission(player.UserIDString, permissionOutpost) || permission.UserHasPermission(player.UserIDString, permissionBandit))
{
if (!TeleportTimers.ContainsKey(player))
{
player.ChatMessage(Lang("NoActiveTeleport", player.UserIDString, teleportCommandOutpost, teleportCommandBandit));
return;
}
CancelTp(player, Lang("TeleportCancelled", player.UserIDString));
}
else
{
player.ChatMessage(Lang("NoPermission", player.UserIDString));
}
}
private void FindTowns()
{
foreach (MonumentInfo monument in UnityEngine.Object.FindObjectsOfType<MonumentInfo>())
{
if (monument.name.ToLower().Contains("compound"))
{
List<BaseEntity> list = new List<BaseEntity>();
Vis.Entities(monument.transform.position, 25, list);
foreach (BaseEntity entity in list)
{
if (entity.name.Contains("chair"))
{
Vector3 chairPos = entity.transform.position;
chairPos.y += 1;
if (!OutpostSpawns.Contains(chairPos)) OutpostSpawns.Add(chairPos);
}
}
}
else if (monument.name.Contains("bandit"))
{
Vector3 t = monument.transform.position + -monument.transform.right * -50.75f;
Vector3 pos = t + (monument.transform.forward * -21.75f) + (Vector3.up * 7f);
if (!BanditSpawns.Contains(pos)) BanditSpawns.Add(pos);
}
}
}
private void OnEntityTakeDamage(BaseCombatEntity entity, HitInfo info)
{
var player = entity.ToPlayer();
if (player == null || info == null) return;
if (!TeleportTimers.ContainsKey(player)) return;
NextTick(() =>
{
if (info.damageTypes.Total() <= 0) return;
if (cancelTpAnyDamamage)
{
CancelTp(player, Lang("TeleportCancelledDamage", player.UserIDString));
}
else if (cancelTpPlayerDamage && info?.Initiator is BasePlayer)
{
CancelTp(player, Lang("TeleportCancelledPlayerDamage", player.UserIDString));
}
else if (cancelTpFallDamage && info.damageTypes.Has(DamageType.Fall))
{
CancelTp(player, Lang("TeleportCancelledFallDamage", player.UserIDString));
}
});
}
private void CancelTp(BasePlayer player, string reason)
{
if (TeleportTimers.ContainsKey(player))
{
TeleportTimers[player]?.Destroy();
TeleportTimers.Remove(player);
}
player.ChatMessage(reason);
}
private void Teleport(BasePlayer player, Vector3 position)
{
player.EnsureDismounted();
if (player.net?.connection != null)
player.ClientRPCPlayer(null, player, "StartLoading");
StartSleeping(player);
player.MovePosition(position);
if (player.net?.connection != null)
player.ClientRPCPlayer(null, player, "ForcePositionTo", position);
if (player.net?.connection != null)
player.SetPlayerFlag(BasePlayer.PlayerFlags.ReceivingSnapshot, true);
player.UpdateNetworkGroup();
player.SendNetworkUpdateImmediate();
if (player.net?.connection == null) return;
try { player.ClearEntityQueue(); } catch { }
// FIXED: SendFullSnapshot was removed from Rust. Using SendNetworkUpdate instead.
player.SendNetworkUpdate();
player.SetParent(null, true, true);
}
private void StartSleeping(BasePlayer player)
{
if (player.IsSleeping()) return;
player.SetPlayerFlag(BasePlayer.PlayerFlags.Sleeping, true);
if (!BasePlayer.sleepingPlayerList.Contains(player))
BasePlayer.sleepingPlayerList.Add(player);
player.CancelInvoke("InventoryUpdate");
}
private void LoadData() => storedData = Interface.GetMod().DataFileSystem.ReadObject<StoredData>(this.Name);
private void SaveData() => Interface.GetMod().DataFileSystem.WriteObject(this.Name, storedData);
private Int32 GetUnix() => (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
private T GetConfig<T>(string name, T value) => Config[name] == null ? value : (T)Convert.ChangeType(Config[name], typeof(T));
private string Lang(string key, string id = null, params object[] args) => string.Format(lang.GetMessage(key, this, id), args);
}
}