Exemplo n.º 1
0
        /// <summary>
        /// This method is called when clicks are registered.
        /// </summary>
        public override void OnReceive(Context context, Intent intent)
        {
            base.OnReceive(context, intent);
            Log.Debug("pet", intent.Action);

            // Check if the click is from the "Announcement" button
            if (int.TryParse(intent.Action, out int id))
            {
                PetAction action = (PetAction)id;

                int res = PetLogic(action, context);

                if (res == -1)
                {
                    return;
                }

                AppWidgetManager appWidgetManager = AppWidgetManager.GetInstance(context);
                var component = new ComponentName(context, Java.Lang.Class.FromType(typeof(AppWidget)).Name);

                RemoteViews remoteViews = new RemoteViews(context.PackageName, Resource.Layout.Widget);

                remoteViews.SetImageViewResource(Resource.Id.room, res);

                appWidgetManager.UpdateAppWidget(component, remoteViews);
            }
        }
Exemplo n.º 2
0
        public void SetPetAction(PetAction action)
        {
            switch (action)
            {
            case PetAction.Abandon:
                if (m_master is Character)
                {
                    ((Character)m_master).ActivePet = null;
                }
                break;

            case PetAction.Follow:
                HasPermissionToMove = true;
                break;

            case PetAction.Stay:
                HasPermissionToMove = false;
                break;

            case PetAction.Attack:
                HasPermissionToMove = true;
                var target = m_master.Target;
                if (target != null && MayAttack(target))
                {
                    // remove all aggressors and make the new target a priority
                    m_threatCollection.Clear();
                    m_threatCollection[target] = int.MaxValue;
                    m_brain.State = BrainState.Combat;
                }
                break;
            }
        }
Exemplo n.º 3
0
        public static void HandleAction(IRealmClient client, RealmPacketIn packet)
        {
            EntityId  id = packet.ReadEntityId();
            Character activeCharacter = client.ActiveCharacter;
            NPC       npc             = activeCharacter.Map.GetObject(id) as NPC;

            if (npc == null || npc != activeCharacter.ActivePet || (!npc.IsAlive || npc.PetRecord == null))
            {
                return;
            }
            PetActionEntry petActionEntry = packet.ReadUInt32();

            switch (petActionEntry.Type)
            {
            case PetActionType.SetMode:
                npc.SetPetAttackMode(petActionEntry.AttackMode);
                break;

            case PetActionType.SetAction:
                PetAction action = petActionEntry.Action;
                npc.SetPetAction(action);
                break;

            default:
                WorldObject target = activeCharacter.Map.GetObject(packet.ReadEntityId());
                npc.CastPetSpell(petActionEntry.SpellId, target);
                break;
            }
        }
Exemplo n.º 4
0
    /// <summary>
    /// Função que verifica que ação o pet irá realizar baseado no estado atual do pet e no que ele já realizou anteriormente
    /// </summary>
    /// <returns></returns>
    public virtual IEnumerator PetActionVerifier()
    {
        // Número aleatório gerado para definir quando ocorrerá a próxima verificação
        actionRandom = Random.Range(actionMinRandom, actionMaxRandom);
        if (!isPetDoingSomething)
        {
            // VERIFICAÇÃO DO ESTADO DO PET
            // Verifica se um status específico está fora do limite aceitável para o pet e se a ação já está na lista
            // Se estiver fora do limite e não estiver na lista de ações, adiciona na lista (delegate) e sinaliza como adicionado
            //if (petHealth.GetCleanFoodPot() && !hungryOnDelegate)
            //{
            //    petActionList += PetHungry;
            //    hungryOnDelegate = true;
            //}
            if (drinkCount < pet.drinkTimes[TimeManager.instance.GetCurrentPeriod()] && !thirstyOnDelegate && !player.health.GetCleanWaterPot())
            {
                if (Random.Range(0f, 1f) <= chanceToBeThirsty)
                {
                    Debug.LogWarning("bebe água " + chanceToBeThirsty);
                    drinkCount++;
                    petActionList    += PetThisty;
                    thirstyOnDelegate = true;
                    chanceToBeThirsty = 0;
                }
                else
                {
                    chanceToBeThirsty += increaseChanceToBeThirsty;
                }
            }

            /*
             * if (petHealth.GetHappiness() < healthLimit.GetHappiness() && !sadOnDelegate)
             * {
             *  petActionList += PetSad;
             *  sadOnDelegate = true;
             * }*/

            // Se a lista de ações do pet não estiver vazia, realiza a primeira ação da lista e a remove da lista
            if (petActionList != null)
            {
                // Discretiza a lista de ações da delegate em um vetor de delegates
                petDelegateList = petActionList.GetInvocationList();
                // Chama a função que está armazenada na primeira posição do vetor de delegates como uma coroutine
                StartCoroutine(petDelegateList[0].Method.Name);
                // Remove esta função da lista de funções da delegate
                petActionList -= petDelegateList[0] as PetAction;
            }
            // Caso contrário, chama a função que realiza movimentos aleatórios
            else
            {
                StartCoroutine(PetRandomMove());
            }
        }

        // Aguarda o tempo aleatório gerado anteriormente
        yield return(new WaitForSeconds(actionRandom));

        // Chama a mesma função (para uma nova verificação do estado do pet)
        StartCoroutine(PetActionVerifier());
    }
Exemplo n.º 5
0
 private bool SetPetStatus(PetAction status)
 {
     using (var db = new LiteDatabase(Constant.dbpath)) {
         var pet = db.GetCollection <Pet>("pet").FindOne(Query.Contains("Name", "lala"));
         pet.Status = (int)status;
         return(db.GetCollection <Pet>("pet").Update(pet));
     }
 }
Exemplo n.º 6
0
        /// <summary>
        /// Broadcasts PetAction in range of pet.
        /// </summary>
        /// <param name="pet"></param>
        /// <param name="action"></param>
        public static void PetActionEffect(Creature pet, PetAction action)
        {
            var packet = new Packet(Op.Effect, pet.EntityId);
            packet.PutInt(E.PetAction);
            packet.PutLong(pet.Master.EntityId);
            packet.PutByte((byte)action);
            packet.PutByte(0);

            pet.Region.Broadcast(packet, pet);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Sends any kind of extra command-bar to control other entities, such as NPCs, vehicles etc
        /// </summary>
        /// <param name="owner"></param>
        //public static void SendSpells(Character owner, NPC npc, uint duration,
        //    PetAttackMode attackMode, PetAction action, PetFlags flags,
        //    PetActionEntry[] petActions,
        //    PetSpell[] spells)

        public static void SendSpells(Character owner, NPC pet, PetAction currentAction)
        {
            // TODO: Cooldowns
            var record = pet.PetRecord;
            var mode   = pet.Entry.Type == CreatureType.NonCombatPet ? PetAttackMode.Passive : PetAttackMode.Defensive;
            var flags  = PetFlags.None;

            uint[] actions = null;
            if (record != null)
            {
                mode    = record.AttackMode;
                flags   = record.Flags;
                actions = record.ActionButtons;
            }
            if (actions == null)
            {
                actions = pet.BuildPetActionBar();
            }

            using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_PET_SPELLS, 20 + (PetConstants.PetActionCount * 4) + 1 + (pet.Spells.Count) + 1 + (0)))
            {
                packet.Write(pet.EntityId);
                packet.Write((ushort)pet.Entry.FamilyId);
                packet.Write(pet.RemainingDecayDelayMillis);                                    // duration
                packet.Write((byte)mode);
                packet.Write((byte)currentAction);
                packet.Write((ushort)flags);

                for (var i = 0; i < PetConstants.PetActionCount; i++)
                {
                    var action = actions[i];
                    packet.Write(action);
                }

                var spellPos = packet.Position;
                ++packet.Position;
                var spellCount = 0;
                foreach (var spell in pet.Spells)
                {
                    if (!spell.IsPassive)
                    {
                        packet.Write((ushort)spell.Id);
                        packet.Write((ushort)PetSpellState.Enabled);
                        ++spellCount;
                    }
                }

                packet.Write((byte)0);                          // TODO: Cooldowns

                packet.Position = spellPos;
                packet.Write((byte)spellCount);

                owner.Send(packet);
            }
        }
Exemplo n.º 8
0
        /// <summary>
        /// Broadcasts PetAction in range of pet.
        /// </summary>
        /// <param name="pet"></param>
        /// <param name="action"></param>
        public static void PetActionEffect(Creature pet, PetAction action)
        {
            var packet = new Packet(Op.Effect, pet.EntityId);

            packet.PutInt(E.PetAction);
            packet.PutLong(pet.Master.EntityId);
            packet.PutByte((byte)action);
            packet.PutByte(0);

            pet.Region.Broadcast(packet, pet);
        }
Exemplo n.º 9
0
        public static void SendMode(IPacketReceiver receiver, IEntity pet, PetAttackMode attackMode,
                                    PetAction action, PetFlags flags)
        {
            using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_PET_MODE, 12))
            {
                packet.Write(pet.EntityId);
                packet.Write((byte)attackMode);
                packet.Write((byte)action);
                packet.Write((ushort)flags);

                receiver.Send(packet);
            }
        }
Exemplo n.º 10
0
Arquivo: NPC.Pet.cs Projeto: NVN/WCell
		public void SetPetAction(PetAction action)
		{
			switch (action)
			{
				case PetAction.Abandon:
					if (m_master is Character)
					{
						((Character)m_master).ActivePet = null;
					}
					break;
				case PetAction.Follow:
					HasOwnerPermissionToMove = true;
					break;
				case PetAction.Stay:
					HasOwnerPermissionToMove = false;
					break;
				case PetAction.Attack:
					HasOwnerPermissionToMove = true;
					var target = m_master.Target;
					if (target != null && MayAttack(target))
					{
						// remove all aggressors and make the new target a priority
						m_threatCollection.Clear();
						m_threatCollection[target] = int.MaxValue;
						m_brain.State = BrainState.Combat;
					}
					break;
			}
		}
Exemplo n.º 11
0
 private PendingIntent GetPendingSelfIntent(Context context, PetAction petAction)
 {
     return(GetPendingSelfIntent(context, ((int)petAction).ToString()));
 }
Exemplo n.º 12
0
        private void SchedulePetAction(int second, PetAction petAction, Context context)
        {
            PendingIntent pendingIntent = GetPendingSelfIntent(context, petAction);

            MainActivity.alarmManager.Set(AlarmType.ElapsedRealtime, SystemClock.ElapsedRealtime() + second * 1000, pendingIntent);
        }
Exemplo n.º 13
0
        private int PetLogic(PetAction action, Context context)
        {
            int result = -1;
            //get pet status
            PetAction status = GetPetStatus();
            //pet action which will be scheduled
            PetAction pendingAction = PetAction.Idle;
            //second till pendingAction
            int pendingActionSchedule = 0;
            //get pet info
            Pet pet = GetPetInfo();

            Log.Debug("petaction", action.ToString());
            Log.Debug("petstatus", status.ToString());

            switch (action)
            {
            case PetAction.Idle:
                result = Resource.Drawable.idle_happy;
                if (pet.Happyness < 50)
                {
                    result = Resource.Drawable.idle_unhappy;
                }
                if (pet.Sickness < 20)
                {
                    result = Resource.Drawable.sick;
                }
                break;

            case PetAction.Sleep:
                result = Resource.Drawable.sleep;
                pendingActionSchedule = 100;
                break;

            case PetAction.Bath:
                if (pet.Filthyness < 100)
                {
                    result = Resource.Drawable.bath_happy;
                    pendingActionSchedule = 3;
                    pet.Filthyness        = 100;
                }
                else
                {
                    result = Resource.Drawable.bath_unhappy;
                    pendingActionSchedule = 3;
                }
                break;

            case PetAction.GoOut:
                if (pet.Happyness < 100)
                {
                    result = Resource.Drawable.park_happy;
                    pendingActionSchedule = 10;
                    pet.Happyness         = 100;
                }
                else
                {
                    result = Resource.Drawable.park_unhappy;
                    pendingActionSchedule = 3;
                }
                break;

            case PetAction.Feed:
                if (pet.Hunger < 100)
                {
                    result = Resource.Drawable.eat_happy;
                    pendingActionSchedule = 4;
                    pet.Hunger            = 100;
                }
                else
                {
                    result = Resource.Drawable.eat_unhappy;
                    pendingActionSchedule = 2;
                }
                break;

            case PetAction.Drink:
                if (pet.Thirst < 100)
                {
                    result = Resource.Drawable.drink_happy;
                    pendingActionSchedule = 3;
                    pet.Thirst            = 100;
                }
                else
                {
                    result = Resource.Drawable.drink_unhappy;
                    pendingActionSchedule = 2;
                }
                break;

            case PetAction.Med:
                if (pet.Sickness < 100)
                {
                    result = Resource.Drawable.med_happy;
                    pendingActionSchedule = 5;
                    pet.Sickness          = 100;
                }
                else
                {
                    result = Resource.Drawable.med_unhappy;
                    pendingActionSchedule = 2;
                }
                break;

            case PetAction.Sick:
                result = Resource.Drawable.sick;
                break;

            case PetAction.UpdateStatus:
                result = -1;
                pendingActionSchedule = 10;
                pet.Hunger           -= 10;
                pet.Thirst           -= 10;
                pet.Happyness        -= 10;
                pet.Sleepyness       -= 10;
                pet.Filthyness       -= 10;
                pet.Sickness         -= 50;
                isUpdateStatusSetUp   = false;
                break;

            default:
                break;
            }

            //set pet status in database
            SetPetStatus(action);

            //schedule update status
            if (!isUpdateStatusSetUp)
            {
                SchedulePetAction(10, PetAction.UpdateStatus, context);
                isUpdateStatusSetUp = true;
            }

            //schedule pendingAction
            if (pendingActionSchedule != 0)
            {
                SchedulePetAction(pendingActionSchedule, pendingAction, context);
            }

            //set pet info in database
            SetPetInfo(pet);

            return(result);
        }
Exemplo n.º 14
0
		/// <summary>
		/// Sends any kind of extra command-bar to control other entities, such as NPCs, vehicles etc
		/// </summary>
		/// <param name="owner"></param>
		//public static void SendSpells(Character owner, NPC npc, uint duration,
		//    PetAttackMode attackMode, PetAction action, PetFlags flags,
		//    PetActionEntry[] petActions,
		//    PetSpell[] spells)

		public static void SendSpells(Character owner, NPC pet, PetAction currentAction)
		{
			// TODO: Cooldowns
			var record = pet.PetRecord;
			using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_PET_SPELLS, 20 + (PetConstants.PetActionCount * 4) + 1 + (pet.Spells.Count) + 1 + (0)))
			{
				packet.Write(pet.EntityId);
				packet.Write((ushort)pet.Entry.FamilyId);
				//packet.Write((ushort)0);
				packet.Write(pet.RemainingDecayDelayMillis);			// duration
				packet.Write((byte)record.AttackMode);
				packet.Write((byte)currentAction);
				packet.Write((ushort)record.Flags);

				var actions = record.ActionButtons;
				for (var i = 0; i < PetConstants.PetActionCount; i++)
				{
					var action = actions[i];
					packet.Write(action);
				}

				var spellPos = packet.Position;
				++packet.Position;
				var spellCount = 0;
				foreach (var spell in pet.Spells)
				{
					if (!spell.IsPassive)
					{
						packet.Write(spell.Id | ((uint)PetSpellState.Enabled << 24));
						++spellCount;
					}
				}

				packet.Write((byte)0);		// TODO: Cooldowns

				packet.Position = spellPos;
				packet.Write((byte)spellCount);

				owner.Send(packet);
			}
		}
Exemplo n.º 15
0
		/// <summary>
		/// Sends any kind of extra command-bar to control other entities, such as NPCs, vehicles etc
		/// </summary>
		/// <param name="owner"></param>
		//public static void SendSpells(Character owner, NPC npc, uint duration,
		//    PetAttackMode attackMode, PetAction action, PetFlags flags,
		//    PetActionEntry[] petActions,
		//    PetSpell[] spells)

		public static void SendSpells(Character owner, NPC pet, PetAction currentAction)
		{
			// TODO: Cooldowns
			var record = pet.PetRecord;
            var mode = pet.Entry.Type == CreatureType.NonCombatPet ? PetAttackMode.Passive : PetAttackMode.Defensive;
		    var flags = PetFlags.None;
		    uint[] actions = null;
            if(record != null)
            {
                mode = record.AttackMode;
                flags = record.Flags;
                actions = record.ActionButtons;
            }
            if (actions == null)
                actions = pet.BuildPetActionBar();

		    using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_PET_SPELLS, 20 + (PetConstants.PetActionCount * 4) + 1 + (pet.Spells.Count) + 1 + (0)))
			{
				packet.Write(pet.EntityId);
				packet.Write((ushort)pet.Entry.FamilyId);
				packet.Write(pet.RemainingDecayDelayMillis);			// duration
				packet.Write((byte)mode);
				packet.Write((byte)currentAction);
				packet.Write((ushort)flags);

				for (var i = 0; i < PetConstants.PetActionCount; i++)
				{
					var action = actions[i];
					packet.Write(action);
				}

				var spellPos = packet.Position;
				++packet.Position;
				var spellCount = 0;
				foreach (var spell in pet.Spells)
				{
					if (!spell.IsPassive)
					{
						packet.Write((ushort)spell.Id);
                        packet.Write((ushort)PetSpellState.Enabled);
						++spellCount;
					}
				}

				packet.Write((byte)0);		// TODO: Cooldowns

				packet.Position = spellPos;
				packet.Write((byte)spellCount);

				owner.Send(packet);
			}
		}
Exemplo n.º 16
0
 /// <summary>
 /// Sends any kind of extra command-bar to control other entities, such as NPCs, vehicles etc
 /// </summary>
 /// <param name="owner"></param>
 public static void SendSpells(Character owner, NPC pet, PetAction currentAction)
 {
 }
Exemplo n.º 17
0
    /// <summary>
    /// Função que movimenta o pet para um local determinado e chama uma função quando chegar lá
    /// </summary>
    /// <param name="element"> Local para onde o pet deve ir (variável do tipo ElementLocation) </param>
    /// <param name="functionToCall"> Função a ser chamada (do tipo IEnumerator sem nenhum parametro de entrada) </param>
    /// <returns></returns>
    public IEnumerator MoveToPosition(ElementLocation element, PetAction functionToCall)
    {
        // Chama a verificação do status do pet (verifica se ele está na scene ou não e "instancia" caso necessário)
        gameObject.GetComponent <Invisible>().StatusVerify();

        // Nome da scene em que o pet se encontra
        string currentScene = pet.GetPetLocation().sceneName;
        float  movePosition;
        float  newStartPosition = 0;
        string temp_name        = currentScene;
        // Vaariável que indica se o pet deve continuar procurando pelo local ou se ele já se encontra lá
        bool keepSearching = false;

        // Se o pet está na scene que ele quer estar
        if (currentScene == element.sceneName)
        {
            // O pet se move para o local do objeto que ele estava procurando
            movePosition = element.elementPosition.x;
        }
        else
        {
            // Pet busca pelo caminho que deve seguir até a scene que ele quer estar (scene em que está o objeto que ele está procurando)
            var path = petAccessGraph.BFS(currentScene, element.sceneName);
            // Transforma a informação em uma string separada por vírgulas
            // Depois separa em um vetor de strings, separando pelas vírgulas
            string[] name = HasHSetToString(path).Split(',');

            // Pega o nome da penúltima scene na lista de scenes
            temp_name = name[name.Length - 2];
            // Informa que ele deve continuar procurando pois ainda não está na scene correta
            keepSearching = true;
            // Pega a posição da porta por qual o pet deve entrar para a scene que ele quer ir
            movePosition = petAccessInfo[petAccessInfoIndex].petAccessGraph.GetGraphCost(name[name.Length - 1], name[name.Length - 2]);
            // Pega a posição da porta por qual ele irá sair na nova scene
            newStartPosition = petAccessInfo[petAccessInfoIndex].petAccessGraph.GetGraphCost(name[name.Length - 2], name[name.Length - 1]);
        }

        // Faz o pet se mover até a posição
        petAnimationScript.MoveAnimalAndando(movePosition);

        // Aguarda o fim da movimentação para continuar
        yield return(new WaitUntil(() => !petAnimationScript.isWalking));

        // Se o pet não está onde queria estar
        if (keepSearching)
        {
            Debug.Log("Pet muda de scene e continua a busca..." + temp_name);
            // Inicia a animação de transição de scene
            StartCoroutine(gameObject.GetComponent <Invisible>().PetChangeLocation(temp_name));
            yield return(new WaitForSeconds(0.5f));

            // Posiciona o pet na posição da porta por onde ele deve sair (mantendo as posições y e z atuais do pet)
            Vector3 petPosition = pet.gameObject.transform.position;
            pet.gameObject.transform.position = new Vector3(newStartPosition, petPosition.y, petPosition.z);

            // Chama novamente a função de movimento
            StartCoroutine(MoveToPosition(element, functionToCall));
        }
        else
        {
            Debug.Log("Pet chegou no local marcado");
            // Se ele está no local que queria, chama a função que foi passada como parâmetro
            StartCoroutine(functionToCall());
        }
    }
Exemplo n.º 18
0
		public static void SendMode(IPacketReceiver receiver, IEntity pet, PetAttackMode attackMode,
			PetAction action, PetFlags flags)
		{
			using (var packet = new RealmPacketOut(RealmServerOpCode.SMSG_PET_MODE, 12))
			{
				packet.Write(pet.EntityId);
				packet.Write((byte)attackMode);
				packet.Write((byte)action);
				packet.Write((ushort)flags);

				receiver.Send(packet);
			}
		}
Exemplo n.º 19
0
        void HandlePetAction(PetAction packet)
        {
            ObjectGuid guid1 = packet.PetGUID;         //pet guid
            ObjectGuid guid2 = packet.TargetGUID;      //tag guid

            uint         spellid = UnitActionBarEntry.UNIT_ACTION_BUTTON_ACTION(packet.Action);
            ActiveStates flag    = (ActiveStates)UnitActionBarEntry.UNIT_ACTION_BUTTON_TYPE(packet.Action);          //delete = 0x07 CastSpell = C1

            // used also for charmed creature
            Unit pet = Global.ObjAccessor.GetUnit(GetPlayer(), guid1);

            if (!pet)
            {
                Log.outError(LogFilter.Network, "HandlePetAction: {0} doesn't exist for {1}", guid1.ToString(), GetPlayer().GetGUID().ToString());
                return;
            }

            if (pet != GetPlayer().GetFirstControlled())
            {
                Log.outError(LogFilter.Network, "HandlePetAction: {0} does not belong to {1}", guid1.ToString(), GetPlayer().GetGUID().ToString());
                return;
            }

            if (!pet.IsAlive())
            {
                SpellInfo spell = (flag == ActiveStates.Enabled || flag == ActiveStates.Passive) ? Global.SpellMgr.GetSpellInfo(spellid) : null;
                if (spell == null)
                {
                    return;
                }
                if (!spell.HasAttribute(SpellAttr0.CastableWhileDead))
                {
                    return;
                }
            }

            // @todo allow control charmed player?
            if (pet.IsTypeId(TypeId.Player) && !(flag == ActiveStates.Command && spellid == (uint)CommandStates.Attack))
            {
                return;
            }

            if (GetPlayer().m_Controlled.Count == 1)
            {
                HandlePetActionHelper(pet, guid1, spellid, flag, guid2, packet.ActionPosition.X, packet.ActionPosition.Y, packet.ActionPosition.Z);
            }
            else
            {
                //If a pet is dismissed, m_Controlled will change
                List <Unit> controlled = new List <Unit>();
                foreach (var unit in GetPlayer().m_Controlled)
                {
                    if (unit.GetEntry() == pet.GetEntry() && unit.IsAlive())
                    {
                        controlled.Add(unit);
                    }
                }

                foreach (var unit in controlled)
                {
                    HandlePetActionHelper(unit, guid1, spellid, flag, guid2, packet.ActionPosition.X, packet.ActionPosition.Y, packet.ActionPosition.Z);
                }
            }
        }