private static void AddNewSettlers(double addCount, int numbSkilled, ColonyState state) { var reason = string.Format(SettlerReasoning.GetSettleReason(), addCount); if (numbSkilled > 0) { if (numbSkilled == 1) { reason += string.Format(" {0} of them is skilled!", numbSkilled); } else { reason += string.Format(" {0} of them are skilled!", numbSkilled); } } PandaChat.Send(state.ColonyRef, reason, ChatColor.magenta); for (var i = 0; i < addCount; i++) { var newGuy = new NPCBase(state.ColonyRef, state.ColonyRef.GetRandomBanner().Position); NPCTracker.Add(newGuy); state.ColonyRef.RegisterNPC(newGuy); SettlerInventory.GetSettlerInventory(newGuy); newGuy.CustomData.SetAs(ISSETTLER, true); if (i <= numbSkilled) { newGuy.CustomData.SetAs(GameLoader.ALL_SKILLS, Random.Next(1, 10) * 0.002f); } ModLoader.Callbacks.OnNPCRecruited.Invoke(newGuy); } }
private void OnEnable() { m_attackAI = GetComponent(typeof(AttackAI)) as AttackAI; m_npcTracker = transform.parent.parent.parent.parent.GetComponent(typeof(NPCTracker)) as NPCTracker; m_objectTrasform = transform.parent.parent; startingClosestObject = FindObjectOfType <ClosestObjectInitTagScript>().transform; }
void TweenCell() { GameObject cell; if (NPCTracker.AccusedCorrectly()) { cell = theirCell; } else { cell = yourCell; } cell.gameObject.SetActive(true); tweener = cell.GetComponent <Image>().DOFade(0, 1).SetEase(Ease.InCirc).From(); tweener.OnComplete(() => { tweener = null; if (NPCTracker.AccusedCorrectly()) { winSound.gameObject.SetActive(true); } else { loseSound.gameObject.SetActive(true); hahaBubble.gameObject.SetActive(NPCTracker.Culprit != NPCTracker.ID.Cat); catHahaBubble.gameObject.SetActive(NPCTracker.Culprit == NPCTracker.ID.Cat); } }); if (!NPCTracker.AccusedCorrectly()) { culprit.gameObject.SetActive(true); culprit.DOFade(0, 1).From().SetEase(Ease.InCirc); npc.DOFade(0, 1).SetEase(Ease.InCirc); } }
public static void OnPlayerConnectedEarly(Players.Player p) { if (p.IsConnected && !Configuration.OfflineColonies) { foreach (Colony c in p.Colonies) { if (c.Owners.Count(own => own.IsConnected) == 1) { var file = $"{GameLoader.GAMEDATA_FOLDER}/savegames/{ServerManager.WorldName}/NPCArchive/{c.ColonyID}.json"; if (File.Exists(file) && JSON.Deserialize(file, out var followersNode, false)) { File.Delete(file); PandaLogger.Log(ChatColor.cyan, $"Player {p.ID.steamID} is reconnected. Restoring Colony."); foreach (var node in followersNode.LoopArray()) { try { node.SetAs("id", GetAIID()); var npc = new NPCBase(c, node); c.RegisterNPC(npc); NPCTracker.Add(npc); ModLoader.TriggerCallbacks(ModLoader.EModCallbackType.OnNPCLoaded, npc, node); foreach (var job in new List <IJob>(c.JobFinder.JobsData.OpenJobs)) { if (node.TryGetAs("JobPoS", out JSONNode pos) && job.GetJobLocation() == (Vector3Int)pos) { if (job.IsValid && job.NeedsNPC) { npc.TakeJob(job); c.JobFinder.Remove(job); } break; } } } catch (Exception ex) { PandaLogger.LogError(ex); } } JSON.Serialize(file, new JSONNode(NodeType.Array)); c.JobFinder.Update(); c.SendCommonData(); } } } } }
new public void InitializeJob(Players.Player owner, Vector3Int position, int desiredNPCID) { this.position = position; this.owner = owner; if (desiredNPCID != 0 && NPCTracker.TryGetNPC(desiredNPCID, out usedNPC)) { usedNPC.TakeJob(this); } else { desiredNPCID = 0; } }
private void Awake() { if (Instance == null) { Instance = this; //DontDestroyOnLoad(gameObject); } else { Destroy(gameObject); } npc = GameObject.FindGameObjectWithTag("Background"); }
public DefaultFarmerAreaJob(Players.Player owner, Vector3Int min, Vector3Int max, int npcID = 0) { positionMin = min; positionMax = max; this.owner = owner; NPCBase foundNPC = null; if (npcID != 0) { NPCTracker.TryGetNPC(npcID, out foundNPC); } NPC = foundNPC; }
public virtual void InitializeJob(Players.Player owner, Vector3Int position, int desiredNPCID) { this.position = position; this.owner = owner; NPCBase foundNPC = null; if (desiredNPCID != 0) { if (!NPCTracker.TryGetNPC(desiredNPCID, out foundNPC)) { Log.WriteWarning("Failed to find npc ID {0}", desiredNPCID); } } NPC = foundNPC; }
void AccuseCurrent() { Animator animator = GetComponent <Animator>(); animator.SetBool("Grounded", true); animator.SetBool("Moving", false); speechBubble.OnAccusationMade(); NPCTracker.Accused = current.ID; NPCTracker.AccusedCorrectly(); current.BecomeAccused(transform.position); accusing = true; StartCoroutine(EndGame()); }
private static int GetAIID() { while (true) { if (_idNext == 1000000000) { _idNext = 1; } if (!NPCTracker.Contains(_idNext)) { break; } _idNext++; } return(_idNext++); }
public static void Click(Players.Player player, Box <PlayerClickedData> boxedData) { var healed = false; if (!_coolDown.ContainsKey(player)) { _coolDown.Add(player, 0); } if (boxedData.item1.clickType == PlayerClickedData.ClickType.Right && boxedData.item1.typeSelected == Item.ItemIndex) { if (Time.MillisecondsSinceStart > _coolDown[player]) { var healing = new HealingOverTimePC(player, INITIALHEAL, TOTALHOT, 5); healed = true; } } else if (boxedData.item1.clickType == PlayerClickedData.ClickType.Left && boxedData.item1.typeSelected == Item.ItemIndex && boxedData.item1.rayCastHit.rayHitType == RayHitType.NPC) { if (NPCTracker.TryGetNPC(boxedData.item1.rayCastHit.hitNPCID, out var npc)) { if (Time.MillisecondsSinceStart > _coolDown[player]) { var heal = new HealingOverTimeNPC(npc, INITIALHEAL, TOTALHOT, 5, Item.ItemIndex); healed = true; } } } if (healed) { _coolDown[player] = Time.MillisecondsSinceStart + COOLDOWN; boxedData.item1.consumedType = PlayerClickedData.ConsumedType.UsedByMod; ServerManager.SendAudio(player.Position, GameLoader.NAMESPACE + ".Bandage"); if (Inventory.TryGetInventory(player, out var inv)) { inv.TryRemove(Item.ItemIndex); } } }
public DefaultFarmerAreaJob(Players.Player owner, Vector3Int min, Vector3Int max, int npcID = 0) { positionMin = min; positionMax = max; this.owner = owner; if (npcID != 0 && NPCTracker.TryGetNPC(npcID, out usedNPC)) { usedNPC.TakeJob(this); } else { npcID = 0; } if (usedNPC == null) { JobTracker.Add(this); } }
void Update() { if (tweener != null) { return; } timer += Time.deltaTime; if ((timer >= 2) || Input.GetButtonDown("Jump")) { timer = 0; state++; if (state == 1) { bubble.gameObject.SetActive(false); catBubble.gameObject.SetActive(false); TweenCell(); } if (state == 2) { if (NPCTracker.AccusedCorrectly()) { winCard.SetActive(true); } else { loseCard.SetActive(true); } } if (state == 3) { finCard.SetActive(true); } if (state == 4) { creditsCard.SetActive(true); } if (state == 5) { UnityEngine.SceneManagement.SceneManager.LoadScene(titleScene); } } }
/// <summary> /// Ran when loading the SMAPI. Used to initialize data. /// </summary> /// <param name="helper"></param> public override void Entry(IModHelper helper) { ModHelper = this.Helper; ModMonitor = this.Monitor; StardewModdingAPI.Events.SaveEvents.AfterLoad += SaveEvents_LoadChar; StardewModdingAPI.Events.SaveEvents.BeforeSave += SaveEvents_BeforeSave; StardewModdingAPI.Events.SaveEvents.AfterSave += SaveEvents_AfterSave; StardewModdingAPI.Events.PlayerEvents.Warped += LocationEvents_CurrentLocationChanged; StardewModdingAPI.Events.GameEvents.UpdateTick += GameEvents_UpdateTick; npcTracker = new NPCTracker(); assetPool = new AssetPool(); var assetManager = new AssetManager(); assetPool.addAssetManager(new KeyValuePair <string, AssetManager>("testNPC", assetManager)); initializeExamples(); initializeAssetPool(); assetPool.loadAllAssets(); }
public virtual void InitializeJob(Players.Player owner, Vector3Int position, int desiredNPCID) { this.position = position; this.owner = owner; if (desiredNPCID != 0) { if (NPCTracker.TryGetNPC(desiredNPCID, out usedNPC)) { usedNPC.TakeJob(this); } else { Log.WriteWarning("Failed to find npc ID {0}", desiredNPCID); } } if (usedNPC == null) { JobTracker.Add(this); } }
public static void Click(Players.Player player, PlayerClickedData playerClickData) { var healed = false; if (!_coolDown.ContainsKey(player)) { _coolDown.Add(player, 0); } if (playerClickData.ClickType == PlayerClickedData.EClickType.Right && playerClickData.TypeSelected == Item.ItemIndex) { if (Time.MillisecondsSinceStart > _coolDown[player]) { var healing = new HealingOverTimePC(player, INITIALHEAL, TOTALHOT, 5); healed = true; } } else if (playerClickData.ClickType == PlayerClickedData.EClickType.Left && playerClickData.TypeSelected == Item.ItemIndex && playerClickData.HitType == PlayerClickedData.EHitType.NPC) { if (NPCTracker.TryGetNPC(playerClickData.GetNPCHit().NPCID, out var npc)) { if (Time.MillisecondsSinceStart > _coolDown[player]) { var heal = new HealingOverTimeNPC(npc, INITIALHEAL, TOTALHOT, 5, Item.ItemIndex); healed = true; } } } if (healed) { _coolDown[player] = Time.MillisecondsSinceStart + COOLDOWN; playerClickData.ConsumedType = PlayerClickedData.EConsumedType.UsedByMod; AudioManager.SendAudio(player.Position, GameLoader.NAMESPACE + ".Bandage"); player.Inventory.TryRemove(Item.ItemIndex); } }
void Start() { spriteRenderer = GetComponent <SpriteRenderer>(); if (ID == NPCTracker.ID.None) { //ghost cat for unknown NPCs spriteRenderer.sprite = NPCTracker.GetSprite(NPCTracker.ID.Cat); spriteRenderer.color = new Color(1.0f, 1.0f, 1.0f, 0.5f); } else { spriteRenderer.sprite = NPCTracker.GetSprite(ID); } if (!homeCollider) { Debug.Log("NPC can't move without a home collider"); return; } InitSpeech(); MoveNext(); }
protected override void ReconsiderDecision() { switch (decision.GoalType) { case ZombieGoal.Banner: if ((!decision.IsValid || decision.PathDistance > MinDistanceToReconsiderBanner) && (ConsiderPlayerTarget(ref decision) || ConsiderNPCTarget(ref decision))) { return; } if (!BannerTracker.Contains(decision.GoalLocation)) { var closest = BannerTracker.GetClosest(originalGoal, position); if (closest != null && AIManager.ZombiePathFinder.TryFindPath(position, closest.KeyLocation, out var path, 2000000000) == EPathFindingResult.Success) { decision.Clear(); decision = new ZombieDecision(this, path); return; } SetCooldown(3.0); } break; case ZombieGoal.NPC: if (!decision.IsValid || decision.PathDistance > MinDistanceToReconsiderNPC) { if (ConsiderPlayerTarget(ref decision)) { return; } NPCBase nPCBase; if (NPCTracker.TryGetNear(position.Vector, MaxRadiusToNPCToConsider, out nPCBase)) { if (decision.IsGoingTo(nPCBase) && IsMovingTargetPathOkay(nPCBase.Position)) { decision.Reconsidered(); return; } if (AIManager.ZombiePathFinder.TryFindPath(position, nPCBase.Position, out var path2, decision.PathDistance / 2) == EPathFindingResult.Success) { decision.Clear(); decision = new ZombieDecision(this, nPCBase, path2); } } if (ConsiderBannerTarget(ref decision)) { return; } } break; case ZombieGoal.Player: if (Players.FindClosestAlive(position.Vector, out var player, out var num)) { if (decision.IsGoingTo(player) && IsMovingTargetPathOkay(player.VoxelPosition)) { decision.Reconsidered(); return; } if (num < MaxSqrdRadiusToPlayerToConsider && AIManager.CanStandAt(player.VoxelPosition) && AIManager.ZombiePathFinder.TryFindPath(position, player.VoxelPosition, out var path3, 2000000000) == EPathFindingResult.Success) { decision.Clear(); decision = new ZombieDecision(this, player, path3); } } if (ConsiderNPCTarget(ref decision) || ConsiderBannerTarget(ref decision)) { return; } break; default: if (ConsiderPlayerTarget(ref decision) || ConsiderNPCTarget(ref decision) || ConsiderBannerTarget(ref decision)) { return; } break; } decision.Reconsidered(); }
public static void PressButton(ButtonPressCallbackData data) { if ((!data.ButtonIdentifier.Contains(".RecruitButton") && !data.ButtonIdentifier.Contains(".FireButton") && !data.ButtonIdentifier.Contains(".MoveFired") && !data.ButtonIdentifier.Contains(".ColonyToolMainMenu") && !data.ButtonIdentifier.Contains(".KillFired") && !data.ButtonIdentifier.Contains(".CallToArms")) || data.Player.ActiveColony == null) { return; } Dictionary <string, JobCounts> jobCounts = GetJobCounts(data.Player.ActiveColony); if (data.ButtonIdentifier.Contains(".ColonyToolMainMenu")) { NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0)); } else if (data.ButtonIdentifier.Contains(".FireButton")) { foreach (var job in jobCounts) { if (data.ButtonIdentifier.Contains(job.Key)) { var recruit = data.Storage.GetAs <int>(job.Key + ".Recruit"); var count = GetCountValue(recruit); var menu = BuildMenu(data.Player, jobCounts, true, job.Key, count); menu.LocalStorage.SetAs(GameInitializer.NAMESPACE + ".FiredJobName", job.Key); menu.LocalStorage.SetAs(GameInitializer.NAMESPACE + ".FiredJobCount", count); NetworkMenuManager.SendServerPopup(data.Player, menu); break; } } } else if (data.ButtonIdentifier.Contains(".KillFired")) { var firedJob = data.Storage.GetAs <string>(GameInitializer.NAMESPACE + ".FiredJobName"); var count = data.Storage.GetAs <int>(GameInitializer.NAMESPACE + ".FiredJobCount"); foreach (var job in jobCounts) { if (job.Key == firedJob) { if (count > job.Value.TakenCount) { count = job.Value.TakenCount; } for (int i = 0; i < count; i++) { var npc = job.Value.TakenJobs[i].NPC; npc.ClearJob(); npc.OnDeath(); } break; } } data.Player.ActiveColony.SendCommonData(); jobCounts = GetJobCounts(data.Player.ActiveColony); NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0)); } else if (data.ButtonIdentifier.Contains(".MoveFired")) { var firedJob = data.Storage.GetAs <string>(GameInitializer.NAMESPACE + ".FiredJobName"); var count = data.Storage.GetAs <int>(GameInitializer.NAMESPACE + ".FiredJobCount"); foreach (var job in jobCounts) { if (data.ButtonIdentifier.Contains(job.Key)) { if (count > job.Value.AvailableCount) { count = job.Value.AvailableCount; } if (jobCounts.TryGetValue(firedJob, out var firedJobCounts)) { for (int i = 0; i < count; i++) { if (firedJobCounts.TakenCount > i) { var npc = firedJobCounts.TakenJobs[i].NPC; npc.ClearJob(); npc.TakeJob(job.Value.AvailableJobs[i]); data.Player.ActiveColony.JobFinder.Remove(job.Value.AvailableJobs[i]); } else { break; } } } data.Player.ActiveColony.SendCommonData(); break; } } jobCounts = GetJobCounts(data.Player.ActiveColony); NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0)); } else if (data.ButtonIdentifier.Contains(".RecruitButton")) { foreach (var job in jobCounts) { if (data.ButtonIdentifier.Contains(job.Key)) { var recruit = data.Storage.GetAs <int>(job.Key + ".Recruit"); var count = GetCountValue(recruit); if (count > job.Value.AvailableCount) { count = job.Value.AvailableCount; } for (int i = 0; i < count; i++) { var num = 0f; data.Player.ActiveColony.HappinessData.RecruitmentCostCalculator.GetCost(data.Player.ActiveColony.HappinessData.CachedHappiness, data.Player.ActiveColony, out float foodCost); if (data.Player.ActiveColony.Stockpile.TotalFood < foodCost || !data.Player.ActiveColony.Stockpile.TryRemoveFood(ref num, foodCost)) { PandaChat.Send(data.Player, _localizationHelper, "Notenoughfood", ChatColor.red); break; } else { var newGuy = new NPCBase(data.Player.ActiveColony, data.Player.ActiveColony.GetClosestBanner(new Vector3Int(data.Player.Position)).Position); newGuy.FoodHoursCarried = ServerManager.ServerSettings.NPCs.InitialFoodCarriedHours; data.Player.ActiveColony.RegisterNPC(newGuy); ColonistInventory.Get(newGuy); NPCTracker.Add(newGuy); ModLoader.Callbacks.OnNPCRecruited.Invoke(newGuy); if (newGuy.IsValid) { newGuy.TakeJob(job.Value.AvailableJobs[i]); data.Player.ActiveColony.JobFinder.Remove(job.Value.AvailableJobs[i]); } } } data.Player.ActiveColony.SendCommonData(); jobCounts = GetJobCounts(data.Player.ActiveColony); NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0)); } } } }
private void InitSpeech() { speechIcon1 = SpeechHelper.UnknownSprite; speechIcon2 = SpeechHelper.UnknownSprite; bool isCulprit = ID == NPCTracker.Culprit; bool sameTraincar = NPCTracker.FindCulprit().GetTraincar() == GetTraincar(); #region Special Case: Cat & Twins if (ID == NPCTracker.ID.Cat) { if (NPCTracker.IsTwin(NPCTracker.Culprit)) { Accused = NPCTracker.FindCulprit(); speechIcon1 = SpeechHelper.GetIcon_Person(NPCTracker.ID.Cat); speech2IsDirection = true; speechEmotion = SpeechEmotion.Scared; return; } else { Accused = this; speechIcon1 = SpeechHelper.GetIcon_Person(NPCTracker.ID.Cat); speechIcon2 = SpeechHelper.MiscIcons.Meow; speechEmotion = SpeechEmotion.Loopy; return; } } if (NPCTracker.IsTwin(ID) && NPCTracker.IsTwin(NPCTracker.Culprit)) { Accused = NPCTracker.FindNPC( ID == NPCTracker.ID.TwinRed ? NPCTracker.ID.TwinBlue : NPCTracker.ID.TwinRed ); speechIcon1 = SpeechHelper.GetIcon_Person(Accused.ID); speech2IsDirection = true; speechEmotion = SpeechEmotion.Emphatic; return; } #endregion //base certainty float certainty = sameTraincar ? 1.0f : 0.9f; //accuse somebody float rng_wrongAccusation = isCulprit ? 1.0f : sameTraincar ? 0.0f : Random.Range(0.0f, 1.0f) ; if (rng_wrongAccusation < 0.4f) { Accused = NPCTracker.FindCulprit(); } else if (rng_wrongAccusation < 0.7f) { Accused = NPCTracker.FindNPC(NPCTracker.GetRandomNPCID()); certainty -= 0.5f; } else { Accused = NPCTracker.FindNPC(NPCTracker.RedHerring); certainty -= 0.3f; } //should never happen; just for safety if (Accused == null) { Accused = NPCTracker.FindNPC(NPCTracker.RedHerring); } while (Accused == this) { Accused = NPCTracker.FindNPC(NPCTracker.GetRandomNPCID()); } //first icon represents accusation float rng_vagueness = sameTraincar ? Random.Range(0.0f, 0.6f) : Random.Range(0.0f, 1.0f) ; if (rng_vagueness < 0.3f) { speechIcon1 = SpeechHelper.GetIcon_Person(Accused.ID); certainty -= 0.2f; } else if (rng_vagueness < 0.7f) { var traits = SpeechHelper.GetTraitList(Accused.ID).Icons; speechIcon1 = traits[Random.Range(0, traits.Length)]; } else { speechIcon1 = SpeechHelper.GetIcon_Car(Accused.GetTraincar()); } //second icon and animation represent certainty float rng_certainty = Random.Range(0.0f, certainty); if (rng_certainty < 0.2f) { speechIcon2 = SpeechHelper.GetIcon_Certainty(false); speechEmotion = SpeechEmotion.Loopy; } else if (rng_certainty < 0.5f) { speech2IsDirection = true; speechEmotion = SpeechEmotion.Loopy; } else if (rng_certainty < 0.7f) { speech2IsDirection = true; speechEmotion = SpeechEmotion.Scared; } else { speechIcon2 = SpeechHelper.GetIcon_Certainty(true); speechEmotion = SpeechEmotion.Emphatic; } }
public static void WeaponAttack(Players.Player player, Box <PlayerClickedData> boxedData) { if (boxedData.item1.IsConsumed) { return; } var click = boxedData.item1; var rayCastHit = click.rayCastHit; var state = PlayerState.GetPlayerState(player); if (WeaponLookup.ContainsKey(click.typeSelected) && click.rayCastHit.rayHitType == RayHitType.NPC && click.clickType == PlayerClickedData.ClickType.Left) { var millisecondsSinceStart = Time.MillisecondsSinceStart; if (state.Weapon.IsEmpty() || state.Weapon.Id != click.typeSelected) { state.Weapon = new SettlerInventory.ArmorState { Id = click.typeSelected, Durability = WeaponLookup[click.typeSelected].Durability } } ; if (Players.LastPunches.TryGetValue(player, out var num) && millisecondsSinceStart - num < Players.PlayerPunchCooldownMS) { return; } Players.LastPunches[player] = millisecondsSinceStart; boxedData.item1.consumedType = PlayerClickedData.ConsumedType.UsedByMod; if (ZombieID.IsZombieID(rayCastHit.hitNPCID)) { if (MonsterTracker.TryGetMonsterByID(rayCastHit.hitNPCID, out var monster)) { monster.OnHit(WeaponLookup[click.typeSelected].Damage); state.Weapon.Durability--; ServerManager.SendAudio(monster.PositionToAimFor, "punch"); } } else if (NPCTracker.TryGetNPC(rayCastHit.hitNPCID, out var nPCBase)) { nPCBase.OnHit(WeaponLookup[click.typeSelected].Damage); state.Weapon.Durability--; ServerManager.SendAudio(nPCBase.Position.Vector, "punch"); } if (state.Weapon.Durability <= 0) { state.Weapon = new SettlerInventory.ArmorState(); player.TakeItemFromInventory(click.typeSelected); PandaChat.Send(player, $"Your {WeaponLookup[click.typeSelected].Metal} {WeaponLookup[click.typeSelected].WeaponType} has broke!", ChatColor.orange); } } } }
public static void WeaponAttack(Players.Player player, PlayerClickedData playerClickData) { if (playerClickData.IsConsumed) { return; } var click = playerClickData; var state = PlayerState.GetPlayerState(player); if (WeaponLookup.ContainsKey(click.TypeSelected) && click.HitType == PlayerClickedData.EHitType.NPC && click.ClickType == PlayerClickedData.EClickType.Left) { var millisecondsSinceStart = Time.MillisecondsSinceStart; if (state.Weapon.IsEmpty() || state.Weapon.Id != click.TypeSelected) { state.Weapon = new ItemState { Id = click.TypeSelected, Durability = WeaponLookup[click.TypeSelected].WepDurability } } ; if (Players.LastPunches.TryGetValue(player, out var num) && num.TimeSinceThis < Players.PlayerPunchCooldownMS) { return; } Players.LastPunches[player] = ServerTimeStamp.Now; playerClickData.ConsumedType = PlayerClickedData.EConsumedType.UsedByMod; var rayCastHit = click.GetNPCHit(); if (ZombieID.IsZombieID(rayCastHit.NPCID)) { if (MonsterTracker.TryGetMonsterByID(rayCastHit.NPCID, out var monster)) { var dmg = WeaponLookup[click.TypeSelected].Damage.TotalDamage(); state.IncrimentStat("Damage Delt", dmg); monster.OnHit(dmg); state.Weapon.Durability--; AudioManager.SendAudio(monster.PositionToAimFor, "punch"); } } else if (NPCTracker.TryGetNPC(rayCastHit.NPCID, out var nPCBase)) { var dmg = WeaponLookup[click.TypeSelected].Damage.TotalDamage(); state.IncrimentStat("Damage Delt", dmg); nPCBase.OnHit(dmg, player, ModLoader.OnHitData.EHitSourceType.PlayerClick); state.Weapon.Durability--; AudioManager.SendAudio(nPCBase.Position.Vector, "punch"); } if (state.Weapon.Durability <= 0) { state.Weapon = new ItemState(); player.TakeItemFromInventory(click.TypeSelected); PandaChat.Send(player, _localizationHelper, "Broke", ChatColor.orange, ItemId.GetItemId(click.TypeSelected).LocalizedName(player)); } } }
public static Sprite GetIcon_Person_Random() { return(GetIcon_Person(NPCTracker.GetRandomNPCID())); }
public static void PressButton(ButtonPressCallbackData data) { if ((!data.ButtonIdentifier.Contains(".RecruitButton") && !data.ButtonIdentifier.Contains(".FireButton") && !data.ButtonIdentifier.Contains(".SwapJob") && !data.ButtonIdentifier.Contains(".ColonyToolMainMenu") && !data.ButtonIdentifier.Contains(".KillFired") && !data.ButtonIdentifier.Contains(".AutoRecruitment")) || data.Player.ActiveColony == null) { return; } Dictionary <string, JobCounts> jobCounts = GetJobCounts(data.Player.ActiveColony); Dictionary <Players.Player, string> AutoRecruit_Opt = new Dictionary <Players.Player, string>(); if (data.ButtonIdentifier.Contains(".ColonyToolMainMenu")) { NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0)); } else if (data.ButtonIdentifier.Contains(".FireButton")) { foreach (var job in jobCounts) { if (data.ButtonIdentifier.Contains(job.Key)) { var recruit = data.Storage.GetAs <int>(job.Key + ".Recruit"); var count = GetCountValue(recruit); var menu = BuildMenu(data.Player, jobCounts, true, job.Key, count); menu.LocalStorage.SetAs(Nach0Config.NAMESPACE + ".FiredJobName", job.Key); menu.LocalStorage.SetAs(Nach0Config.NAMESPACE + ".FiredJobCount", count); NetworkMenuManager.SendServerPopup(data.Player, menu); break; } } } else if (data.ButtonIdentifier.Contains(".KillFired")) { var firedJob = data.Storage.GetAs <string>(Nach0Config.NAMESPACE + ".FiredJobName"); var count = data.Storage.GetAs <int>(Nach0Config.NAMESPACE + ".FiredJobCount"); foreach (var job in jobCounts) { if (job.Key == firedJob) { if (count > job.Value.TakenCount) { count = job.Value.TakenCount; } for (int i = 0; i < count; i++) { var npc = job.Value.TakenJobs[i].NPC; npc.ClearJob(); npc.OnDeath(); } break; } } data.Player.ActiveColony.SendCommonData(); jobCounts = GetJobCounts(data.Player.ActiveColony); NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0)); } else if (data.ButtonIdentifier.Contains(".SwapJob")) { var firedJob = data.Storage.GetAs <string>(Nach0Config.NAMESPACE + ".FiredJobName"); var count = data.Storage.GetAs <int>(Nach0Config.NAMESPACE + ".FiredJobCount"); foreach (var job in jobCounts) { if (data.ButtonIdentifier.Contains(job.Key)) { if (count > job.Value.AvailableCount) { count = job.Value.AvailableCount; } if (jobCounts.TryGetValue(firedJob, out var firedJobCounts)) { for (int i = 0; i < count; i++) { if (firedJobCounts.TakenCount > i) { var npc = firedJobCounts.TakenJobs[i].NPC; npc.ClearJob(); npc.TakeJob(job.Value.AvailableJobs[i]); data.Player.ActiveColony.JobFinder.Remove(job.Value.AvailableJobs[i]); } else { break; } } } data.Player.ActiveColony.SendCommonData(); break; } } jobCounts = GetJobCounts(data.Player.ActiveColony); NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0)); } else if (data.ButtonIdentifier.Contains(".RecruitButton")) { foreach (var job in jobCounts) { if (data.ButtonIdentifier.Contains(job.Key)) { var recruit = data.Storage.GetAs <int>(job.Key + ".Recruit"); var count = GetCountValue(recruit); if (count > job.Value.AvailableCount) { count = job.Value.AvailableCount; } for (int i = 0; i < count; i++) { var num = 0f; data.Player.ActiveColony.HappinessData.RecruitmentCostCalculator.GetCost(data.Player.ActiveColony.HappinessData.CachedHappiness, data.Player.ActiveColony, out float foodCost); if (data.Player.ActiveColony.Stockpile.TotalFood < foodCost || !data.Player.ActiveColony.Stockpile.TryRemoveFood(ref num, foodCost)) { //PandaChat.Send(data.Player, _localizationHelper.LocalizeOrDefault("Notenoughfood", data.Player), ChatColor.red); Chat.Send(data.Player, "<color=red>Notenoughfood</color>"); break; } else { var newGuy = new NPCBase(data.Player.ActiveColony, data.Player.ActiveColony.GetClosestBanner(new Vector3Int(data.Player.Position)).Position); data.Player.ActiveColony.RegisterNPC(newGuy); //SettlerInventory.GetSettlerInventory(newGuy); NPCTracker.Add(newGuy); //ModLoader.TriggerCallbacks(ModLoader.EModCallbackType.OnNPCRecruited, newGuy); if (newGuy.IsValid) { newGuy.TakeJob(job.Value.AvailableJobs[i]); data.Player.ActiveColony.JobFinder.Remove(job.Value.AvailableJobs[i]); } } } data.Player.ActiveColony.SendCommonData(); jobCounts = GetJobCounts(data.Player.ActiveColony); NetworkMenuManager.SendServerPopup(data.Player, BuildMenu(data.Player, jobCounts, false, string.Empty, 0)); } } } else if (data.ButtonIdentifier.Contains(".AutoRecruitment")) { if (AutoRecruit_Opt[data.Player].Equals("on")) { AutoRecruit_Opt[data.Player] = "off"; Chat.Send(data.Player, "<color=blue>Auto Recruitment is now " + AutoRecruit_Opt[data.Player] + "</color>"); } else { AutoRecruit_Opt[data.Player] = "on"; Chat.Send(data.Player, "<color=blue>Auto Recruitment is now " + AutoRecruit_Opt[data.Player] + "</color>"); } } }
void Start() { Accused.sprite = NPCTracker.GetSprite(NPCTracker.Accused); Culprit.sprite = NPCTracker.GetSprite(NPCTracker.Culprit); }
public static bool EvaluateSettlers(ColonyState state) { var update = false; if (state.ColonyRef.OwnerIsOnline()) { if (state.NextGenTime == 0) { state.NextGenTime = Time.SecondsSinceStartDouble + Random.Next(8, 16) * IN_GAME_HOUR_IN_SECONDS; } if (Time.SecondsSinceStartDouble > state.NextGenTime && state.ColonyRef.FollowerCount >= MAX_BUYABLE) { var chance = state.ColonyRef.TemporaryData.GetAsOrDefault(PandaResearch.GetResearchKey(PandaResearch.SettlerChance), 0f) + state.Difficulty.AdditionalChance; chance += SettlerEvaluation.SpawnChance(state); var rand = Random.NextFloat(); if (chance > rand) { var addCount = Math.Floor(state.MaxPerSpawn * chance); // if we lost alot of colonists add extra to help build back up. if (state.ColonyRef.FollowerCount < state.HighestColonistCount) { var diff = state.HighestColonistCount - state.ColonyRef.FollowerCount; addCount += Math.Floor(diff * .25); } try { var skillChance = state.ColonyRef.TemporaryData.GetAsOrDefault(PandaResearch.GetResearchKey(PandaResearch.SkilledLaborer), 0f); var numbSkilled = 0; rand = Random.NextFloat(); try { if (skillChance > rand) { numbSkilled = Pipliz.Random.Next(1, 2 + Pipliz.Math.RoundToInt(state.ColonyRef.TemporaryData.GetAsOrDefault(PandaResearch.GetResearchKey(PandaResearch.NumberSkilledLaborer), 0f))); } } catch (Exception ex) { PandaLogger.Log("NumberSkilledLaborer"); PandaLogger.LogError(ex); } if (addCount > 0) { if (addCount > 30) { addCount = 30; } var reason = string.Format(SettlerReasoning.GetSettleReason(), addCount); if (numbSkilled > 0) { if (numbSkilled == 1) { reason += string.Format(" {0} of them is skilled!", numbSkilled); } else { reason += string.Format(" {0} of them are skilled!", numbSkilled); } } PandaChat.Send(state.ColonyRef, reason, ChatColor.magenta); for (var i = 0; i < addCount; i++) { var newGuy = new NPCBase(state.ColonyRef, state.ColonyRef.GetRandomBanner().Position); NPCTracker.Add(newGuy); state.ColonyRef.RegisterNPC(newGuy); SettlerInventory.GetSettlerInventory(newGuy); newGuy.CustomData.SetAs(ISSETTLER, true); if (i <= numbSkilled) { newGuy.CustomData.SetAs(GameLoader.ALL_SKILLS, Random.Next(1, 10) * 0.002f); } update = true; ModLoader.TriggerCallbacks(ModLoader.EModCallbackType.OnNPCRecruited, newGuy); } } } catch (Exception ex) { PandaLogger.Log("SkilledLaborer"); PandaLogger.LogError(ex); } if (state.ColonyRef.FollowerCount > state.HighestColonistCount) { state.HighestColonistCount = state.ColonyRef.FollowerCount; } } state.NextGenTime = Time.SecondsSinceStartDouble + Random.Next(8, 16) * IN_GAME_HOUR_IN_SECONDS; state.ColonyRef.SendCommonData(); } } return(update); }
public bool TryDoCommand(Players.Player causedBy, string chattext, List <string> splits) { if (!splits[0].Equals("/spawnnpc")) { return(false); } if (!PermissionsManager.CheckAndWarnPermission(causedBy, AntiGrief.MOD_PREFIX + "npcandbeds")) { return(true); } Match m = Regex.Match(chattext, @"/spawnnpc (?<amount>\d+) ?(?<player>['].+[']|[^ ]+)?"); if (!m.Success) { Chat.Send(causedBy, "Syntax: /spawnnpc {number} [targetplayer]"); return(true); } int amount = 0; if (!int.TryParse(m.Groups["amount"].Value, out amount) || amount <= 0) { Chat.Send(causedBy, "Number should be > 0"); return(true); } Players.Player target = causedBy; string error; if (!m.Groups["player"].Value.Equals("")) { if (!PlayerHelper.TryGetPlayer(m.Groups["player"].Value, out target, out error)) { Chat.Send(causedBy, "Could not find target: {error}"); } } Colony colony = target.ActiveColony; if (colony == null) { Chat.Send(target, "You need to be at an active colony to spawn beds"); if (causedBy != target) { Chat.Send(causedBy, " {target} has no active colony"); } return(true); } BannerTracker.Banner banner = colony.GetClosestBanner(causedBy.VoxelPosition); if (banner == null) { Chat.Send(causedBy, "No banners found for the active colony"); return(true); } for (int i = 0; i < amount; i++) { NPCBase npc = new NPCBase(colony, banner.Position); NPCTracker.Add(npc); colony.RegisterNPC(npc); ModLoader.Callbacks.OnNPCRecruited.Invoke(npc); } Chat.Send(causedBy, $"Spawned {amount} colonists"); return(true); }