/// <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); } }
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; } }
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; } }
/// <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()); }
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)); } }
/// <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); }
/// <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); } }
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); } }
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; } }
private PendingIntent GetPendingSelfIntent(Context context, PetAction petAction) { return(GetPendingSelfIntent(context, ((int)petAction).ToString())); }
private void SchedulePetAction(int second, PetAction petAction, Context context) { PendingIntent pendingIntent = GetPendingSelfIntent(context, petAction); MainActivity.alarmManager.Set(AlarmType.ElapsedRealtime, SystemClock.ElapsedRealtime() + second * 1000, pendingIntent); }
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); }
/// <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); } }
/// <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); } }
/// <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) { }
/// <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()); } }
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); } } }