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); }
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)); }
protected override void ClientDeinitializeStructure(IStaticWorldObject gameObject) { base.ClientDeinitializeStructure(gameObject); foreach (var occupiedTile in gameObject.OccupiedTiles) { SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(occupiedTile, isDestroy: true); } }
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); }
public override void ServerOnDestroy(IStaticWorldObject gameObject) { foreach (var occupiedTile in gameObject.OccupiedTiles) { SharedWallConstructionRefreshHelper.SharedRefreshNeighborObjects(occupiedTile, isDestroy: true); } base.ServerOnDestroy(gameObject); }
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); } }