Пример #1
0
        private void Reprocess(Character character, ItemEntity item, Client client)
        {
            if (item.Quantity < item.Type.PortionSize)
            {
                throw new QuantityLessThanMinimumPortion(item.Type);
            }

            int leftovers         = item.Quantity % item.Type.PortionSize;
            int quantityToProcess = item.Quantity - leftovers;

            List <ReprocessingDB.Recoverables> recoverablesList = this.ReprocessingDB.GetRecoverables(item.Type.ID);

            foreach (ReprocessingDB.Recoverables recoverable in recoverablesList)
            {
                int ratio = recoverable.AmountPerBatch * quantityToProcess / item.Type.PortionSize;

                double efficiency = this.CalculateEfficiency(character, recoverable.TypeID);

                int quantityForClient = (int)(efficiency * (1.0 - this.mCorporation.TaxRate) * ratio);

                // create the new item
                ItemEntity newItem = this.ItemFactory.CreateSimpleItem(this.TypeManager[recoverable.TypeID], character, this.mStation,
                                                                       Flags.Hangar, quantityForClient);
                // notify the client about the new item
                client.NotifyMultiEvent(OnItemChange.BuildNewItemChange(newItem));
            }
        }
Пример #2
0
        public PyDataType AssembleShip(PyInteger itemID, CallInformation call)
        {
            int callerCharacterID = call.Client.EnsureCharacterIsSelected();
            int stationID         = call.Client.EnsureCharacterIsInStation();

            // ensure the item is loaded somewhere in this node
            // this will usually be taken care by the EVE Client
            if (this.ItemFactory.TryGetItem(itemID, out Ship ship) == false)
            {
                throw new CustomError("Ships not loaded for player and hangar!");
            }

            Character character = this.ItemFactory.GetItem <Character>(callerCharacterID);

            if (ship.OwnerID != callerCharacterID)
            {
                throw new AssembleOwnShipsOnly(ship.OwnerID);
            }

            // do not do anything if item is already assembled
            if (ship.Singleton == true)
            {
                return(new ShipAlreadyAssembled(ship.Type));
            }

            // first split the stack
            if (ship.Quantity > 1)
            {
                // subtract one off the stack
                ship.Quantity -= 1;
                ship.Persist();
                // notify the quantity change
                call.Client.NotifyMultiEvent(OnItemChange.BuildQuantityChange(ship, ship.Quantity + 1));

                // create the new item in the database
                Station station = this.ItemFactory.GetStaticStation(stationID);
                ship = this.ItemFactory.CreateShip(ship.Type, station, character);
                // notify the new item
                call.Client.NotifyMultiEvent(OnItemChange.BuildNewItemChange(ship));
            }
            else
            {
                // stack of one, simple as changing the singleton flag
                ship.Singleton = true;
                call.Client.NotifyMultiEvent(OnItemChange.BuildSingletonChange(ship, false));
            }

            // save the ship
            ship.Persist();

            return(null);
        }
Пример #3
0
        private void CreateCmd(string[] argv, CallInformation call)
        {
            if (argv.Length < 2)
            {
                throw new SlashError("create takes at least one argument");
            }

            int typeID   = int.Parse(argv[1]);
            int quantity = 1;

            if (argv.Length > 2)
            {
                quantity = int.Parse(argv[2]);
            }

            if (call.Client.StationID == null)
            {
                throw new SlashError("Creating items can only be done at station");
            }
            // ensure the typeID exists
            if (this.TypeManager.ContainsKey(typeID) == false)
            {
                throw new SlashError("The specified typeID doesn't exist");
            }

            // create a new item with the correct locationID
            Station   location  = this.ItemFactory.GetStaticStation((int)call.Client.StationID);
            Character character = this.ItemFactory.GetItem <Character>(call.Client.EnsureCharacterIsSelected());

            Type       itemType = this.TypeManager[typeID];
            ItemEntity item     = this.ItemFactory.CreateSimpleItem(itemType, character, location, Flags.Hangar, quantity);

            item.Persist();

            // send client a notification so they can display the item in the hangar
            call.Client.NotifyMultiEvent(OnItemChange.BuildNewItemChange(item));
        }
Пример #4
0
        private void GiveSkillCmd(string[] argv, CallInformation call)
        {
            // TODO: NOT NODE-SAFE, MUST REIMPLEMENT TAKING THAT INTO ACCOUNT!
            if (argv.Length != 4)
            {
                throw new SlashError("GiveSkill must have 4 arguments");
            }

            string target    = argv[1].Trim(new [] { '"', ' ' });
            string skillType = argv[2];
            int    level     = int.Parse(argv[3]);

            if (target != "me")
            {
                throw new SlashError("giveskill only supports me for now");
            }

            Character character = this.ItemFactory.GetItem <Character>(call.Client.EnsureCharacterIsSelected());

            if (skillType == "all")
            {
                // player wants all the skills!
                IEnumerable <KeyValuePair <int, Type> > skillTypes =
                    this.TypeManager.Where(x => x.Value.Group.Category.ID == (int)Categories.Skill && x.Value.Published == true);

                Dictionary <int, Skill> injectedSkills = character.InjectedSkillsByTypeID;

                foreach (KeyValuePair <int, Type> pair in skillTypes)
                {
                    // skill already injected, train it to the desired level
                    if (injectedSkills.ContainsKey(pair.Key) == true)
                    {
                        Skill skill = injectedSkills[pair.Key];

                        skill.Level = level;
                        skill.Persist();
                        call.Client.NotifyMultiEvent(new OnSkillTrained(skill));
                    }
                    else
                    {
                        // skill not injected, create it, inject and done
                        Skill skill = this.ItemFactory.CreateSkill(pair.Value, character, level,
                                                                   SkillHistoryReason.GMGiveSkill);

                        call.Client.NotifyMultiEvent(OnItemChange.BuildNewItemChange(skill));
                        call.Client.NotifyMultiEvent(new OnSkillInjected());
                    }
                }
            }
            else
            {
                int skillTypeID = int.Parse(skillType);
                Dictionary <int, Skill> injectedSkills = character.InjectedSkillsByTypeID;

                if (injectedSkills.ContainsKey(skillTypeID) == true)
                {
                    Skill skill = injectedSkills[skillTypeID];

                    skill.Level = level;
                    skill.Persist();
                    call.Client.NotifyMultiEvent(new OnSkillTrained(skill));
                }
                else
                {
                    // skill not injected, create it, inject and done
                    Skill skill = this.ItemFactory.CreateSkill(this.TypeManager[skillTypeID], character, level,
                                                               SkillHistoryReason.GMGiveSkill);

                    call.Client.NotifyMultiEvent(OnItemChange.BuildNewItemChange(skill));
                    call.Client.NotifyMultiEvent(new OnSkillInjected());
                }
            }
        }
Пример #5
0
        public PyDataType InjectSkillIntoBrain(PyList itemIDs, CallInformation call)
        {
            foreach (PyInteger item in itemIDs.GetEnumerable <PyInteger>())
            {
                try
                {
                    // get the item by it's ID and change the location of it
                    Skill skill = this.ItemFactory.GetItem <Skill>(item);

                    // check if the character already has this skill injected
                    if (this.Character.InjectedSkillsByTypeID.ContainsKey(skill.Type.ID) == true)
                    {
                        throw new CharacterAlreadyKnowsSkill(skill.Type);
                    }

                    // is this a stack of skills?
                    if (skill.Quantity > 1)
                    {
                        // add one of the skill into the character's brain
                        Skill newStack = this.ItemFactory.CreateSkill(skill.Type, this.Character, 0, SkillHistoryReason.None);

                        // subtract one from the quantity
                        skill.Quantity -= 1;

                        // save to database
                        skill.Persist();

                        // finally notify the client
                        call.Client.NotifyMultiEvent(OnItemChange.BuildQuantityChange(skill, skill.Quantity + 1));
                        call.Client.NotifyMultiEvent(OnItemChange.BuildNewItemChange(newStack));
                    }
                    else
                    {
                        // store old values for the notification
                        int   oldLocationID = skill.LocationID;
                        Flags oldFlag       = skill.Flag;

                        // now set the new values
                        skill.LocationID = this.Character.ID;
                        skill.Flag       = Flags.Skill;
                        skill.Level      = 0;
                        skill.Singleton  = true;

                        // ensure the character has the skill in his/her brain
                        this.Character.AddItem(skill);

                        // ensure the changes are saved
                        skill.Persist();

                        // notify the character of the change in the item
                        call.Client.NotifyMultiEvent(OnItemChange.BuildLocationChange(skill, oldFlag, oldLocationID));
                        call.Client.NotifyMultiEvent(OnItemChange.BuildSingletonChange(skill, false));
                    }
                }
                catch (CharacterAlreadyKnowsSkill)
                {
                    throw;
                }
                catch (Exception)
                {
                    Log.Error($"Cannot inject itemID {item} into {this.Character.ID}'s brain...");
                    throw;
                }
            }

            // send the skill injected notification to refresh windows if needed
            call.Client.NotifyMultiEvent(new OnSkillInjected());

            return(null);
        }