Пример #1
0
        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;
 }
Пример #3
0
    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);
        }
    }
Пример #4
0
        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();
                        }
                    }
                }
            }
        }
Пример #5
0
 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;
     }
 }
Пример #6
0
 private void Awake()
 {
     if (Instance == null)
     {
         Instance = this;
         //DontDestroyOnLoad(gameObject);
     }
     else
     {
         Destroy(gameObject);
     }
     npc = GameObject.FindGameObjectWithTag("Background");
 }
Пример #7
0
        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;
        }
Пример #8
0
        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;
        }
Пример #9
0
    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());
    }
Пример #10
0
        private static int GetAIID()
        {
            while (true)
            {
                if (_idNext == 1000000000)
                {
                    _idNext = 1;
                }

                if (!NPCTracker.Contains(_idNext))
                {
                    break;
                }
                _idNext++;
            }

            return(_idNext++);
        }
Пример #11
0
        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);
                }
            }
        }
Пример #12
0
        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);
            }
        }
Пример #13
0
 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);
         }
     }
 }
Пример #14
0
        /// <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();
        }
Пример #15
0
        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);
            }
        }
Пример #16
0
        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);
            }
        }
Пример #17
0
    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();
    }
Пример #18
0
        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();
        }
Пример #19
0
        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));
                    }
                }
            }
        }
Пример #20
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;
        }
    }
Пример #21
0
        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);
                }
            }
        }
    }
Пример #22
0
        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));
                }
            }
        }
Пример #23
0
 public static Sprite GetIcon_Person_Random()
 {
     return(GetIcon_Person(NPCTracker.GetRandomNPCID()));
 }
Пример #24
0
        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);
 }
Пример #26
0
        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);
        }