private static ErrorCodes PrepareDeliverOneAssignment(Character character, long wrapperEid, out VolumeWrapperContainer volumeWrapperContainer)
        {
            volumeWrapperContainer = Container.GetOrThrow(wrapperEid) as VolumeWrapperContainer;
            if (volumeWrapperContainer == null)
            {
                return(ErrorCodes.DefinitionNotSupported);
            }

            if (volumeWrapperContainer.Owner != character.Eid)
            {
                return(ErrorCodes.AccessDenied);
            }

            var transportAssignmentInfo = GetByContainer(volumeWrapperContainer);

            if (transportAssignmentInfo == null)
            {
                //no assignment for this container
                return(ErrorCodes.NoTransportAssignmentForContainer);
            }

            var ownerCharacter = transportAssignmentInfo.ownercharacter;

            if (transportAssignmentInfo.Retrieved)
            {
                var targetBaseEid = transportAssignmentInfo.sourcebaseeid;
                if (!DockingBase.Exists(transportAssignmentInfo.sourcebaseeid))
                {
                    targetBaseEid = DefaultCorporation.GetDockingBaseEid(ownerCharacter);
                }

                Logger.Info("retrieved assignment was found " + transportAssignmentInfo);
                transportAssignmentInfo.RetrieveToBasePublicContainer(volumeWrapperContainer, targetBaseEid);
                return(ErrorCodes.NoError);
            }

            var baseOfWrapper = volumeWrapperContainer.TraverseForStructureRootEid();

            if (transportAssignmentInfo.targetbaseeid != baseOfWrapper)
            {
                return(ErrorCodes.TransportAssignmentCannotBeDeliveredHere);
            }

            var publicContainer = Container.GetFromStructure(transportAssignmentInfo.targetbaseeid);

            publicContainer.ReloadItems(character);

            AdministerDelivery(transportAssignmentInfo, volumeWrapperContainer, publicContainer);

            return(ErrorCodes.NoError);
        }
示例#2
0
        public void HandleRequest(IRequest request)
        {
            using (var scope = Db.CreateTransaction())
            {
                var character = request.Session.Character;
                var member    = Character.Get(request.Data.GetOrDefault <int>(k.memberID));

                if (character == member)
                {
                    return;
                }

                //a member was kicked, while he was leaving the corp
                _corporationManager.CleanUpCharacterLeave(member);

                var corporation = character.GetPrivateCorporationOrThrow();
                var issuerRole  = corporation.GetMemberRole(character);

                issuerRole.IsAnyRole(CorporationRole.CEO, CorporationRole.HRManager, CorporationRole.DeputyCEO).ThrowIfFalse(ErrorCodes.InsufficientPrivileges);

                var issuerCEO = issuerRole.IsAnyRole(CorporationRole.CEO);

                var targetRole = corporation.GetMemberRole(member);

                //if the issuer is NOT ceo then we have some rules
                if (!issuerCEO)
                {
                    //no ceo, no deputyCEO
                    targetRole.IsAnyRole(CorporationRole.CEO, CorporationRole.DeputyCEO).ThrowIfTrue(ErrorCodes.InsufficientPrivileges);
                }

                //----------------------------------------------
                //%%% ALLIANCE stuff es egyebek!!!!!!!! %%%
                //ez itt egy hack
                targetRole = CorporationRole.NotDefined;
                //-----------------------------------------------

                //alliance board membership and all the rest is protected by this branch
                targetRole.ThrowIfNotEqual(CorporationRole.NotDefined, ErrorCodes.MemberHasRolesError);

                var freelancerCorporation = DefaultCorporation.GetFreelancerCorporation();
                freelancerCorporation.AddMember(member, CorporationRole.NotDefined, corporation);

                corporation.RemoveMember(member);

                freelancerCorporation.Save();

                Transaction.Current.OnCommited(() =>
                {
                    if (_characterProfiles is CachedCharacterProfileRepository c)
                    {
                        c.Remove(member.Id);
                    }

                    _channelManager.LeaveChannel(corporation.ChannelName, member);
                    _channelManager.JoinChannel(freelancerCorporation.ChannelName, member, CorporationRole.NotDefined);
                    _corporationManager.InformCorporationMemberTransferred(corporation, freelancerCorporation, member, character);

                    member.GetPlayerRobotFromZone()?.UpdateCorporationOnZone(freelancerCorporation.Eid);

                    //inform the zones
                    var info = new Dictionary <string, object>
                    {
                        { k.from, corporation.Eid },
                        { k.to, freelancerCorporation.Eid },
                        { k.characterID, member.Id },
                    };

                    _zoneManager.Zones.ForEach(z => z.UpdateCorporation(CorporationCommand.TransferMember, info));
                });

                Message.Builder.FromRequest(request).WithOk().Send();

                scope.Complete();
            }
        }
示例#3
0
        public void HandleRequest(IRequest request)
        {
            using (var scope = Db.CreateTransaction())
            {
                var nick     = request.Data.GetOrDefault <string>(k.nick).Trim();
                var avatar   = request.Data.GetOrDefault <Dictionary <string, object> >(k.avatar);
                var raceID   = request.Data.GetOrDefault <int>(k.raceID);
                var majorID  = request.Data.GetOrDefault <int>(k.majorID);
                var schoolID = request.Data.GetOrDefault <int>(k.schoolID);
                var sparkID  = request.Data.GetOrDefault <int>(k.sparkID);

                var account = _accountManager.Repository.Get(request.Session.AccountId);
                if (account == null)
                {
                    throw new PerpetuumException(ErrorCodes.AccountNotFound);
                }

                Character.CheckNickAndThrowIfFailed(nick, request.Session.AccessLevel, account);

                //only 3 characters per account is allowed
                var activeCharactersCount = _accountManager.GetActiveCharactersCount(account);
                if (activeCharactersCount >= 3)
                {
                    throw new PerpetuumException(ErrorCodes.MaximumAmountOfCharactersReached);
                }

                if (account.FirstCharacterDate == null)
                {
                    account.FirstCharacterDate = DateTime.Now;
                    _accountManager.Repository.Update(account);
                }

                var character = CreateNewCharacter();
                character.AccountId = account.Id;
                character.Nick      = nick;
                character.Avatar    = GenxyString.FromDictionary(avatar);
                character.IsDocked  = true;

                DockingBase        dockingBase;
                DefaultCorporation corporation;

                if (schoolID > 0)
                {
                    if (majorID == 0 || raceID == 0 || sparkID == 0)
                    {
                        throw new PerpetuumException(ErrorCodes.WTFErrorMedicalAttentionSuggested);
                    }

                    corporation = DefaultCorporation.GetBySchool(raceID, schoolID) ?? throw new PerpetuumException(ErrorCodes.CorporationNotExists);
                    dockingBase = corporation.GetDockingBase();
                    dockingBase.CreateStarterRobotForCharacter(character, true);

                    character.MajorId  = majorID;
                    character.RaceId   = raceID;
                    character.SchoolId = schoolID;
                    character.SparkId  = sparkID;
                    character.AddToWallet(TransactionType.CharacterCreate, 20000);

                    var extensions = character.GetDefaultExtensions();
                    character.SetExtensions(extensions);

                    var sparkToActivate = _sparkHelper.ConvertCharacterWizardSparkIdToSpark(sparkID);
                    _sparkHelper.ActivateSpark(character, sparkToActivate);
                }
                else
                {
                    // training
                    dockingBase = _dockingBaseHelper.GetTrainingDockingBase();
                    corporation = ((TrainingDockingBase)dockingBase).GetTrainingCorporation();
                    character.SetAllExtensionLevel(5);
                    dockingBase.CreateStarterRobotForCharacter(character);
                    character.AddToWallet(TransactionType.CharacterCreate, 10000000);
                }

                character.CurrentDockingBaseEid = dockingBase.Eid;
                character.DefaultCorporationEid = corporation.Eid;

                //add to default corp, only in sql
                corporation.AddNewCharacter(character);

                _accountManager.PackageGenerateAll(account);

                Transaction.Current.OnCommited(() =>
                {
                    _channelManager.JoinChannel(corporation.ChannelName, character);
                    Message.Builder.FromRequest(request).SetData(k.characterID, character.Id).Send();
                });

                scope.Complete();
            }
        }
        public static void DockingBaseKilled(long baseEid)
        {
            var assignments = GetRunningTransportAssignmentsByBaseEid(baseEid).ToArray();

            foreach (var transportAssignmentInfo in assignments)
            {
                var ownerCharacter = transportAssignmentInfo.ownercharacter;

                var volumeWrapperContainer = transportAssignmentInfo.GetContainer();

                var containerRoot = volumeWrapperContainer.TraverseForStructureRootEid();

                if (containerRoot > 0)
                {
                    //yes, the container is retrievable.

                    if (containerRoot == baseEid)
                    {
                        // the container dies
                        Logger.Info("the container was on the killed base. " + transportAssignmentInfo);
                        transportAssignmentInfo.WriteLog(TransportAssignmentEvent.targetBaseDeleted, transportAssignmentInfo.targetbaseeid);
                    }
                    else
                    {
                        Logger.Info("retrieve location is valid. " + transportAssignmentInfo);

                        if (transportAssignmentInfo.sourcebaseeid == baseEid)
                        {
                            //innen kene vinni, de nem rakhatom ide vissza mert ez a bazis semmisul meg eppen
                            baseEid = DefaultCorporation.GetDockingBaseEid(ownerCharacter);
                        }
                        else
                        {
                            baseEid = transportAssignmentInfo.sourcebaseeid;
                        }

                        transportAssignmentInfo.RetrieveToBasePublicContainer(volumeWrapperContainer, baseEid);
                        Logger.Info("transport assignment's related base was deleted " + transportAssignmentInfo);
                    }

                    continue;
                }

                //the container is in a robot cargo on the zone, next docking will take care of it
                transportAssignmentInfo.Retrieved = true;
                transportAssignmentInfo.WriteLog(TransportAssignmentEvent.targetBaseDeleted, transportAssignmentInfo.targetbaseeid);
            }

            Transaction.Current.OnCommited(() =>
            {
                foreach (var transportAssignmentInfo in assignments)
                {
                    var result = new Dictionary <string, object>
                    {
                        { k.assignment, transportAssignmentInfo.ToDictionary() }
                    };

                    Message.Builder.SetCommand(Commands.TransportAssignmentBaseDeleted).WithData(result).ToCharacter(transportAssignmentInfo.ownercharacter).Send();

                    if (transportAssignmentInfo.volunteercharacter != Character.None)
                    {
                        Message.Builder.SetCommand(Commands.TransportAssignmentBaseDeleted).WithData(result).ToCharacter(transportAssignmentInfo.volunteercharacter).Send();
                    }
                }

                Logger.Info(assignments.Length + " transport assignments were deleted with base:" + baseEid);
            });
        }