/// <summary>
 /// 
 /// </summary>
 /// <returns></returns>
 public bool CanStartFight(CharacterEntity character)
 {
     if (m_map.FightTeam0Cells.Count == 0 || m_map.FightTeam1Cells.Count == 0)
     {
         character.Dispatch(WorldMessage.SERVER_ERROR_MESSAGE("Unable to start fight withouth fightCells"));
         return false;
     }
     return true;
 }
示例#2
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        public void StartUse(CharacterEntity character)
        {
            if(!character.CanGameAction(GameActionTypeEnum.EXCHANGE))
            {
                character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.ERROR, InformationEnum.ERROR_YOU_ARE_AWAY));
                return;
            }

            character.ExchangeStorage(m_storage);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        public void Buy(CharacterEntity character)
        {
            if (m_paddock.OnSale)
            {

            }
            else
            {
                // Trying to buy a public or already owned paddock, cheating for sure :)))
                character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                Logger.Info("PaddockDoor::Buy() trying to buy a free or already owned paddock " + character.Name);
            }
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="character"></param>
 public void Access(CharacterEntity character)
 {
     if (m_paddock.Public)
     {
         character.ExchangePaddock(m_paddock);
     }
     else if (!m_paddock.OnSale)
     {
         // TODO : if in the same guild and has enough rights
     }
     else
     {
         // Trying to access to an in sale paddock, almost cheating no ?
         character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
     }
 }
示例#5
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        /// <param name="skill"></param>
        public override void UseWithSkill(CharacterEntity character, JobSkill skill)
        {
            if (!character.Waypoints.Any(waypoint => waypoint.MapId == Map.Id))
            {
                CharacterWaypointRepository.Instance.Create(character.Id, Map.Id);
                character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.INFO, InformationEnum.INFO_WAYPOINT_REGISTERED));
            }

            switch(skill.Id)
            {
                case SkillIdEnum.SKILL_SAUVEGARDER:
                    Save(character);
                    break;

                case SkillIdEnum.SKILL_UTILISER_ZAAP:
                    Use(character);
                    break;
            }
        }
示例#6
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="character"></param>
 public void Save(CharacterEntity character)
 {
     character.SavedMapId = Map.Id;
     character.SavedCellId = character.CellId;
     character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.INFO, InformationEnum.INFO_WAYPOINT_SAVED));
 }
示例#7
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        /// <returns></returns>
        public bool CanJoinBeforeStart(CharacterEntity character)
        {
            if (LeaderId < 0 && AlignmentId == -1) // cant join taxcollector or monsters
                return false;

            // No more fighter accepted
            if (FreePlace == null || IsOptionLocked(FightOptionTypeEnum.TYPE_NEW_PLAYER_BIS))
            {
                character.Dispatch(WorldMessage.GAME_ACTION(GameActionTypeEnum.FIGHT_JOIN, character.Id, "f"));
                return false;
            }

            if (IsOptionLocked(FightOptionTypeEnum.TYPE_PARTY) && character.PartyId != ((CharacterEntity)m_fighters[0]).PartyId)
            {
                character.Dispatch(WorldMessage.GAME_ACTION(GameActionTypeEnum.FIGHT_JOIN, character.Id, "f"));
                return false;
            }

            // no more place
            if(FreePlace == null)
            {
                character.Dispatch(WorldMessage.GAME_ACTION(GameActionTypeEnum.FIGHT_JOIN, character.Id, "c")); // FULL
                return false;
            }

            switch(Fight.Type)
            {
                case FightTypeEnum.TYPE_PVT:
                    var taxCollector = OpponentTeam.Fighters[0] as TaxCollectorEntity;
                    if (taxCollector == null)
                        return false;

                    if(character.GuildMember != null && character.GuildMember.GuildId == taxCollector.Guild.Id)
                    {
                        character.Dispatch(WorldMessage.SERVER_ERROR_MESSAGE("You can't take part in a fight against your own TaxCollector."));
                        return false;
                    }
                    break;

                case FightTypeEnum.TYPE_PVM:
                case FightTypeEnum.TYPE_AGGRESSION:
                    return AlignmentId <= (int)AlignmentTypeEnum.ALIGNMENT_NEUTRAL || character.AlignmentId == AlignmentId;
            }

            return true;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        /// <param name="skill"></param>
        private void Harvest(CharacterEntity character, SkillIdEnum skill)
        {
            if(!character.CanGameAction(GameActionTypeEnum.SKILL_HARVEST))
            {
                character.Dispatch(WorldMessage.IM_ERROR_MESSAGE(InformationEnum.ERROR_YOU_ARE_AWAY));
                return;
            }

            if (!IsActive)
                return;

            m_currentJob = character.CharacterJobs.GetJob(skill);
            if (m_currentJob == null)
                return;

            var duration = m_currentJob.HarvestDuration;
            m_quantityFarmed = Util.Next(m_currentJob.HarvestMinQuantity, m_currentJob.HarvestMaxQuantity);

            character.HarvestStart(this, duration);
            m_currentHarvester = character;

            Deactivate();

            m_harvestTimer = base.AddTimer(duration, StopHarvest, true);
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        /// <param name="categoryId"></param>
        /// <param name="floorId"></param>
        /// <param name="price"></param>
        public void TryBuy(CharacterEntity character, int categoryId, int floorId, long price)
        {
            Logger.Debug("AuctionHouse::TryBuy categoryId=" + categoryId + " floorId=" + floorId + " price=" + price);

            if(price < 1)
            {
                character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                return;
            }

            if(character.Inventory.Kamas < price)
            {
                character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.ERROR, InformationEnum.ERROR_NOT_ENOUGH_KAMAS));
                return;
            }

            if(!m_categoryById.ContainsKey(categoryId))
            {
                character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                return;
            }

            var category = m_categoryById[categoryId];
            var floor = GetFloorById(floorId);
            if(floor == AuctionCategoryFloorEnum.INVALID)
            {
                character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                return;
            }
            var auction = category.FirstOrDefault(floor);

            switch (category.Buy(character, floor, price))
            {
                case AuctionBuyResultEnum.ALREADY_SOLD:
                    character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.INFO, InformationEnum.INFO_ITEM_ALREADY_SOLD));
                    SendCategoriesByTemplate(character, category.TemplateId);
                    break;

                case AuctionBuyResultEnum.NOT_ENOUGH_KAMAS:
                    character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.ERROR, InformationEnum.ERROR_NOT_ENOUGH_KAMAS));
                    break;

                case AuctionBuyResultEnum.SUCCES:
                    m_auctionsByAccount[auction.OwnerId].Remove(auction);
                    if (!CheckEmptyCategory(category))
                    {
                        SendCategoriesByTemplate(character, category.TemplateId);
                    }

                    UpdateMiddlePrice(category.TemplateId);

                    character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.INFO, InformationEnum.INFO_AUCTION_LOT_BOUGHT));

                    WorldService.Instance.AddMessage(() =>
                    {
                        auction.OwnerBank.AddKamas(price);

                        // check if player online and notify
                        var seller = EntityManager.Instance.GetCharacterByAccount(auction.OwnerId);
                        if (seller != null)
                        {
                            seller.AddMessage(() =>
                            {
                                seller.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.INFO, InformationEnum.INFO_AUCTION_BANK_CREDITED, price, auction.Item.TemplateId));
                                if (seller.HasGameAction(GameActionTypeEnum.EXCHANGE))
                                {
                                    var action = seller.CurrentAction as GameAuctionHouseSellAction;
                                    if (action != null)
                                    {
                                        if (action.AuctionExchange.Npc.AuctionHouse.Id == Id)
                                        {
                                            action.AuctionExchange.Npc.AuctionHouse.SendAuctionOwnerList(seller);
                                        }
                                    }
                                }
                            });
                        }
                    });
                    break;

                default:
                    character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                    break;
            }
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="character"></param>
 public void SendTemplatesByTypeList(CharacterEntity character, int type)
 {
     var templates = new List<int>();
     if(m_templatesByType.ContainsKey(type))
         templates.AddRange(m_templatesByType[type]);
     character.Dispatch(WorldMessage.AUCTION_HOUSE_TEMPLATE_LIST(type, templates));
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="character"></param>
 /// <param name="templateId"></param>
 public void SendCategoriesByTemplate(CharacterEntity character, int templateId)
 {
     var categories = new List<AuctionCategory>();
     if (m_categoriesByTemplate.ContainsKey(templateId))
         categories.AddRange(m_categoriesByTemplate[templateId]);
     character.Dispatch(WorldMessage.AUCTION_HOUSE_AUCTION_LIST(templateId, categories));
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="character"></param>
 public void SendAuctionOwnerList(CharacterEntity character)
 {
     if (!m_auctionsByAccount.ContainsKey(character.AccountId))
         m_auctionsByAccount.Add(character.AccountId, new List<AuctionEntry>());
     character.Dispatch(WorldMessage.AUCTION_HOUSE_AUCTION_OWNER_LIST(m_auctionsByAccount[character.AccountId]));
 }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        public void TrySpectate(CharacterEntity character)
        {
            AddMessage(() =>
                    {
                        if (LoopState == FightLoopStateEnum.STATE_WAIT_END || LoopState == FightLoopStateEnum.STATE_ENDED)
                        {
                            character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                            return;
                        }

                        if (State != FightStateEnum.STATE_FIGHTING)
                        {
                            Logger.Debug("FightBase::TrySpectate cannot spectate placement " + character.Name);
                            character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.ERROR, InformationEnum.ERROR_FIGHT_SPECTATOR_LOCKED));
                            return;
                        }

                        if (!SpectatorTeam.CanJoin)
                        {
                            character.Dispatch(WorldMessage.INFORMATION_MESSAGE(InformationTypeEnum.ERROR, InformationEnum.ERROR_FIGHT_SPECTATOR_LOCKED));
                            return;
                        }

                        character.JoinSpectator(this);

                        SendFightJoinInfos(character);
                    });
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        /// <param name="teamId"></param>
        public void TryJoin(CharacterEntity character, long teamId)
        {
            AddMessage(() =>
                {
                    if (LoopState == FightLoopStateEnum.STATE_WAIT_END || LoopState == FightLoopStateEnum.STATE_ENDED)
                    {
                        character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                        return;
                    }

                    if (State != FightStateEnum.STATE_PLACEMENT)
                    {
                        Logger.Debug("FightBase::TryJoin fight already started " + character.Name);
                        character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                        return;
                    }

                    if (!CanJoin(character))
                    {
                        character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                        return;
                    }

                    var team = teamId == Team0.LeaderId ? Team0 : Team1;

                    if (!team.CanJoinBeforeStart(character))
                    {
                        Logger.Debug("FightBase::TryJoin cannot join team before start " + character.Name);
                        character.Dispatch(WorldMessage.BASIC_NO_OPERATION());
                        return;
                    }

                    JoinFight(character, team);
                });
        }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="character"></param>
 /// <param name="skillId"></param>
 public virtual void UseWithSkill(CharacterEntity character, JobSkill skill)
 {
     character.Dispatch(WorldMessage.SERVER_INFO_MESSAGE("Interactive object not yet implemented."));
 }
示例#16
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        /// <param name="kick"></param>
        /// <returns></returns>
        public override FightActionResultEnum FightQuit(CharacterEntity character, bool kick = false)
        {
            if (LoopState == FightLoopStateEnum.STATE_WAIT_END || LoopState == FightLoopStateEnum.STATE_ENDED)
                return FightActionResultEnum.RESULT_NOTHING;

            switch (State)
            {
                case FightStateEnum.STATE_PLACEMENT:
                    if (kick)
                    {
                        character.Fight.Dispatch(WorldMessage.FIGHT_FLAG_UPDATE(OperatorEnum.OPERATOR_REMOVE, character.Team.LeaderId, character));
                        character.Fight.Dispatch(WorldMessage.GAME_MAP_INFORMATIONS(OperatorEnum.OPERATOR_REMOVE, character));
                        character.EndFight(true);
                        character.Dispatch(WorldMessage.FIGHT_LEAVE());
                        return FightActionResultEnum.RESULT_NOTHING;
                    }

                    if (TryKillFighter(character, character, true, true) != FightActionResultEnum.RESULT_END)
                    {
                        character.EndFight();
                        character.Dispatch(WorldMessage.FIGHT_LEAVE());
                        return FightActionResultEnum.RESULT_DEATH;
                    }

                    return FightActionResultEnum.RESULT_END;

                case FightStateEnum.STATE_FIGHTING:
                    if (character.IsSpectating)
                    {
                        character.EndFight(kick);
                        character.Dispatch(WorldMessage.FIGHT_LEAVE());

                        return FightActionResultEnum.RESULT_NOTHING;
                    }

                    if (TryKillFighter(character, character, true, true) != FightActionResultEnum.RESULT_END)
                    {
                        Result.AddResult(character);
                        character.EndFight();
                        character.Dispatch(WorldMessage.FIGHT_LEAVE());

                        return FightActionResultEnum.RESULT_DEATH;
                    }

                    return FightActionResultEnum.RESULT_END;
            }

            return FightActionResultEnum.RESULT_NOTHING;
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        /// <param name="itemId"></param>
        public void TryRemove(CharacterEntity character, long itemId)
        {
            Logger.Debug("AuctionHouse::TryRemove itemId=" + itemId);

            if(!m_auctionsByAccount.ContainsKey(character.AccountId))
            {
                character.Dispatch(WorldMessage.OBJECT_MOVE_ERROR());
                return;
            }

            var auction = m_auctionsByAccount[character.AccountId].Find(entry => entry.ItemId == itemId);
            if(auction == null)
            {
                character.Dispatch(WorldMessage.OBJECT_MOVE_ERROR());
                return;
            }

            m_auctionsByAccount[character.AccountId].Remove(auction);
            AuctionCategory category = null;
            int i = 0;
            var categories = m_categoriesByTemplate[auction.Item.TemplateId];
            while(i < categories.Count && category == null)
            {
                var current = categories[i];
                if(current.Remove(auction))
                    category = current;
            }

            CheckEmptyCategory(category);
            UpdateMiddlePrice(category.TemplateId);

            auction.Remove();
            character.Inventory.AddItem(auction.Item);

            SendAuctionOwnerList(character);
        }
示例#18
0
        /// <summary>
        /// 
        /// </summary>
        /// <param name="character"></param>
        /// <param name="monsterGroup"></param>
        public bool StartMonsterFight(CharacterEntity character, MonsterGroupEntity monsterGroup)
        {
            if (!CanStartFight(character))
                return false;
            
            if (!character.CanGameAction(GameActionTypeEnum.FIGHT))
            {
                character.Dispatch(WorldMessage.IM_ERROR_MESSAGE(InformationEnum.ERROR_YOU_ARE_AWAY));
                return false;
            }

            monsterGroup.StopAction(GameActionTypeEnum.MAP);
            Add(new MonsterFight(m_map, m_fightId++, character, monsterGroup));
            
            return true;
        }
示例#19
0
 /// <summary>
 /// 
 /// </summary>
 /// <param name="character"></param>
 /// <param name="cellId"></param>
 /// <param name="skillId"></param>
 public void InteractiveExecute(CharacterEntity character, int cellId, int skillId)
 {
     var cell = GetCell(cellId);
     if(cell != null)
     {
         if(cell.InteractiveObject != null)
         {
             cell.InteractiveObject.UseWithSkill(character, character.CharacterJobs.GetSkill(skillId));
         }
         else
         {
             character.Dispatch(WorldMessage.SERVER_INFO_MESSAGE("Not implemented yet."));
         }
     }
 }