Пример #1
0
        private IStaticWorldObject ServerCreateConstructionSite(
            Vector2Ushort tilePosition,
            IProtoObjectStructure protoStructure,
            ICharacter byCharacter)
        {
            if (protoStructure == null)
            {
                throw new ArgumentNullException(nameof(protoStructure));
            }

            var protoConstructionSite = protoStructure.ConstructionSitePrototype;
            var constructionSite      = Server.World.CreateStaticWorldObject(protoConstructionSite, tilePosition);

            var serverState = ProtoObjectConstructionSite.GetPublicState(constructionSite);

            serverState.Setup(protoStructure);

            // reinitialize to build proper physics and occupy proper layout
            constructionSite.ServerRebuildScopeAndPhysics();

            Logger.Important("Construction site created: " + constructionSite);
            protoConstructionSite.ServerOnBuilt(constructionSite, byCharacter);
            Api.SafeInvoke(() => ServerStructureBuilt?.Invoke(byCharacter, constructionSite));
            Api.SafeInvoke(() => SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(
                               constructionSite,
                               isDestroy: false));

            return(constructionSite);
        }
        protected virtual IStaticWorldObject ServerCreateConstructionSite(
            Vector2Ushort tilePosition,
            IProtoObjectStructure protoStructure,
            ICharacter byCharacter)
        {
            if (protoStructure == null)
            {
                throw new ArgumentNullException(nameof(protoStructure));
            }

            var protoConstructionSite = Api.GetProtoEntity <ObjectConstructionSite>();
            var constructionSite      = Server.World.CreateStaticWorldObject(protoConstructionSite, tilePosition);

            var serverState = ObjectConstructionSite.GetPublicState(constructionSite);

            serverState.Setup(protoStructure);

            constructionSite.ProtoStaticWorldObject.SharedCreatePhysics(constructionSite);

            Logger.Important("Construction site created: " + constructionSite);
            protoConstructionSite.ServerOnBuilt(constructionSite, byCharacter);
            Api.SafeInvoke(() => ServerStructureBuilt?.Invoke(byCharacter, constructionSite));
            Api.SafeInvoke(() => SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(
                               constructionSite,
                               isDestroy: false));

            return(constructionSite);
        }
Пример #3
0
        protected override void ServerInitialize(ServerInitializeData data)
        {
            base.ServerInitialize(data);

            var worldObject = data.GameObject;

            WorldObjectOwnersSystem.ServerInitialize(worldObject);

            if (!data.IsFirstTimeInit)
            {
                return;
            }

            var publicState  = data.PublicState;
            var privateState = data.PrivateState;

            privateState.AccessMode = WorldObjectAccessMode.OpensToObjectOwnersOrAreaOwners;

            // refresh door type
            publicState.IsHorizontalDoor = DoorHelper.IsHorizontalDoorNeeded(worldObject.OccupiedTile,
                                                                             checkExistingDoor: false);
            publicState.IsOpened = true;

            // refresh nearby door types (horizontal/vertical)
            DoorHelper.RefreshNeighborDoorType(worldObject.OccupiedTile);

            SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(
                data.GameObject.OccupiedTile,
                isDestroy: false);
        }
        protected override void ClientInitialize(ClientInitializeData data)
        {
            // do not call base implementation
            //base.ClientInitialize(data);

            var worldObject = data.GameObject;
            var publicState = data.SyncPublicState;

            var protoStructure = publicState.ConstructionProto;
            var blueprint      = new ClientBlueprintRenderer(Client.Scene.GetSceneObject(worldObject));

            protoStructure.ClientSetupBlueprint(worldObject.OccupiedTile, blueprint);
            blueprint.SpriteRenderer.DrawOrder         = DrawOrder.Default;
            blueprint.SpriteRenderer.RenderingMaterial = BlueprintMaterial.Value;

            ClientConstructionSiteOutlineHelper.CreateOutlineRenderer(worldObject, protoStructure);

            if (protoStructure is IProtoObjectWall ||
                protoStructure is IProtoObjectDoor)
            {
                SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(
                    data.GameObject.OccupiedTile,
                    isDestroy: false);
            }

            var sceneObject = Client.Scene.GetSceneObject(worldObject);

            sceneObject.AddComponent <ClientComponentAutoDisplayConstructionSiteStructurePointsBar>()
            .Setup(worldObject,
                   structurePointsMax: this.SharedGetStructurePointsMax(worldObject));
        }
Пример #5
0
 protected override void ClientDeinitializeStructure(IStaticWorldObject gameObject)
 {
     base.ClientDeinitializeStructure(gameObject);
     foreach (var occupiedTile in gameObject.OccupiedTiles)
     {
         SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(occupiedTile,
                                                                          isDestroy: true);
     }
 }
Пример #6
0
        protected override void ClientInitialize(ClientInitializeData data)
        {
            // don't use base implementation
            //base.ClientInitialize(data);

            this.ClientAddAutoStructurePointsBar(data);

            var publicState = data.PublicState;
            var clientState = data.ClientState;

            this.ClientSetupDoor(data);

            // subscribe on IsOpened change
            var staticWorldObject = data.GameObject;

            publicState.ClientSubscribe(
                _ => _.IsOpened,
                newIsOpened =>
            {
                clientState.IsOpened = newIsOpened;
                this.SharedCreatePhysics(staticWorldObject);
                clientState.SpriteAnimator.Start(isPositiveDirection: newIsOpened);
                Client.Audio.PlayOneShot(
                    this.SoundResourceDoorStart,
                    staticWorldObject,
                    volume: this.SoundsVolume);

                // we don't use the looped "process" door sound
                //Client.Audio.PlayOneShotLooped(
                //    this.SoundResourceDoorProcess,
                //    staticWorldObject,
                //    duration: this.DoorOpenCloseAnimationDuration,
                //    volume: SoundsVolume);

                Client.Audio.PlayOneShot(
                    this.SoundResourceDoorEnd,
                    staticWorldObject,
                    delay: this.DoorOpenCloseAnimationDuration - this.DoorOpenCloseAnimationDuration / 5f,
                    volume: this.SoundsVolume);
            },
                subscriptionOwner: clientState);

            // subscribe on IsHorizontalDoor change
            publicState.ClientSubscribe(
                _ => _.IsHorizontalDoor,
                newIsHorizontal => this.ClientSetupDoor(data),
                subscriptionOwner: clientState);

            foreach (var occupiedTile in staticWorldObject.OccupiedTiles)
            {
                SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(occupiedTile,
                                                                                 isDestroy: false);
            }

            StructureLandClaimIndicatorManager.ClientInitialize(data.GameObject);
        }
Пример #7
0
        public override void ServerOnDestroy(IStaticWorldObject gameObject)
        {
            foreach (var occupiedTile in gameObject.OccupiedTiles)
            {
                SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(occupiedTile,
                                                                                 isDestroy: true);
            }

            base.ServerOnDestroy(gameObject);
        }
Пример #8
0
        protected override void ServerInitialize(ServerInitializeData data)
        {
            base.ServerInitialize(data);

            var worldObject  = data.GameObject;
            var privateState = data.PrivateState;

            WorldObjectOwnersSystem.ServerInitialize(worldObject);

            if (!data.IsFirstTimeInit)
            {
                if (!this.HasOwnersList)
                {
                    privateState.AccessMode = WorldObjectAccessMode.OpensToEveryone;
                }

                return;
            }

            var publicState = data.PublicState;

            privateState.AccessMode = this.HasOwnersList
                                          ? WorldObjectAccessMode.OpensToObjectOwnersOrAreaOwners
                                          : WorldObjectAccessMode.OpensToEveryone;

            // refresh door type
            publicState.IsHorizontalDoor = this.IsHorizontalDoorOnly
                                           ?? DoorHelper.IsHorizontalDoorNeeded(worldObject.OccupiedTile,
                                                                                checkExistingDoor: false);
            publicState.IsOpened = true;

            foreach (var occupiedTile in worldObject.OccupiedTiles)
            {
                SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(occupiedTile,
                                                                                 isDestroy: false);
            }
        }