| @@ -0,0 +1,46 @@ | |||||
| using Preparation.Interface; | |||||
| using Preparation.Utility; | |||||
| namespace GameClass.GameObj | |||||
| { | |||||
| /// <summary> | |||||
| /// 门 | |||||
| /// </summary> | |||||
| public class Door : GameObj | |||||
| { | |||||
| public Door(XY initPos, PlaceType placeType) : | |||||
| base(initPos, GameData.numOfPosGridPerCell / 2, GameObjType.Door) | |||||
| { | |||||
| this.place = placeType; | |||||
| this.CanMove = false; | |||||
| } | |||||
| public override bool IsRigid => true; | |||||
| public override ShapeType Shape => ShapeType.Square; | |||||
| protected override bool IgnoreCollideExecutor(IGameObj targetObj) | |||||
| { | |||||
| return isOpen; | |||||
| } | |||||
| private bool isOpen = false; | |||||
| public bool IsOpen | |||||
| { | |||||
| get => isOpen; | |||||
| set | |||||
| { | |||||
| lock (gameObjLock) | |||||
| isOpen = value; | |||||
| } | |||||
| } | |||||
| private int openOrLockDegree = 0; | |||||
| public int OpenOrLockDegree | |||||
| { | |||||
| get => openOrLockDegree; | |||||
| set | |||||
| { | |||||
| lock (gameObjLock) | |||||
| openOrLockDegree = (value > 0) ? value : 0; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| @@ -190,6 +190,26 @@ namespace GameClass.GameObj | |||||
| Add(new Chest(GameData.GetCellCenterPos(i, j))); | Add(new Chest(GameData.GetCellCenterPos(i, j))); | ||||
| break; | break; | ||||
| } | } | ||||
| case (uint)PlaceType.Door3: | |||||
| { | |||||
| Add(new Door(GameData.GetCellCenterPos(i, j), PlaceType.Door3)); | |||||
| break; | |||||
| } | |||||
| case (uint)PlaceType.Door5: | |||||
| { | |||||
| Add(new Door(GameData.GetCellCenterPos(i, j), PlaceType.Door5)); | |||||
| break; | |||||
| } | |||||
| case (uint)PlaceType.Door6: | |||||
| { | |||||
| Add(new Door(GameData.GetCellCenterPos(i, j), PlaceType.Door6)); | |||||
| break; | |||||
| } | |||||
| case (uint)PlaceType.Window: | |||||
| { | |||||
| Add(new Window(GameData.GetCellCenterPos(i, j))); | |||||
| break; | |||||
| } | |||||
| case (uint)PlaceType.BirthPoint1: | case (uint)PlaceType.BirthPoint1: | ||||
| case (uint)PlaceType.BirthPoint2: | case (uint)PlaceType.BirthPoint2: | ||||
| case (uint)PlaceType.BirthPoint3: | case (uint)PlaceType.BirthPoint3: | ||||
| @@ -4,7 +4,7 @@ using Preparation.Utility; | |||||
| namespace GameClass.GameObj | namespace GameClass.GameObj | ||||
| { | { | ||||
| /// <summary> | /// <summary> | ||||
| /// 出口 | |||||
| /// 窗 | |||||
| /// </summary> | /// </summary> | ||||
| public class Window : GameObj | public class Window : GameObj | ||||
| { | { | ||||
| @@ -18,50 +18,21 @@ namespace GameClass.GameObj | |||||
| public override ShapeType Shape => ShapeType.Square; | public override ShapeType Shape => ShapeType.Square; | ||||
| protected override bool IgnoreCollideExecutor(IGameObj targetObj) | protected override bool IgnoreCollideExecutor(IGameObj targetObj) | ||||
| { | { | ||||
| if (targetObj.Type != GameObjType.Character) | |||||
| return true; // 非玩家不碰撞 | |||||
| else if (!((Character)targetObj).IsGhost()) | |||||
| return true; // 不是鬼不碰撞 | |||||
| if (targetObj == whoIsClimbing) | |||||
| return true; | |||||
| return false; | return false; | ||||
| } | } | ||||
| private bool powerSupply = false; | |||||
| public bool PowerSupply | |||||
| private Character? whoIsClimbing = null; | |||||
| public Character? WhoIsClimbing | |||||
| { | { | ||||
| get => powerSupply; | |||||
| get => whoIsClimbing; | |||||
| set | set | ||||
| { | { | ||||
| lock (gameObjLock) | lock (gameObjLock) | ||||
| powerSupply = value; | |||||
| whoIsClimbing = value; | |||||
| } | } | ||||
| } | } | ||||
| private bool isOpening = false; | |||||
| public bool IsOpening | |||||
| { | |||||
| get => isOpening; | |||||
| set | |||||
| { | |||||
| lock (gameObjLock) | |||||
| isOpening = value; | |||||
| } | |||||
| } | |||||
| private int openDegree = 0; | |||||
| public int OpenDegree | |||||
| { | |||||
| get => openDegree; | |||||
| set | |||||
| { | |||||
| if (value > 0) | |||||
| lock (gameObjLock) | |||||
| openDegree = (value < GameData.degreeOfOpenedDoorway) ? value : GameData.degreeOfOpenedDoorway; | |||||
| else | |||||
| lock (gameObjLock) | |||||
| openDegree = 0; | |||||
| } | |||||
| } | |||||
| public bool IsOpen() => (OpenDegree == GameData.degreeOfOpenedDoorway); | |||||
| } | } | ||||
| } | } | ||||
| @@ -288,25 +288,7 @@ namespace Gaming | |||||
| { | { | ||||
| if ((!player.Commandable()) || player.PlayerState == PlayerStateType.IsOpeningTheChest) | if ((!player.Commandable()) || player.PlayerState == PlayerStateType.IsOpeningTheChest) | ||||
| return false; | return false; | ||||
| Chest? chestToOpen = null; | |||||
| gameMap.GameObjLockDict[GameObjType.Chest].EnterReadLock(); | |||||
| try | |||||
| { | |||||
| foreach (Chest chest in gameMap.GameObjDict[GameObjType.Chest]) | |||||
| { | |||||
| if (GameData.ApproachToInteract(chest.Position, player.Position)) | |||||
| { | |||||
| chestToOpen = chest; | |||||
| break; | |||||
| } | |||||
| } | |||||
| } | |||||
| finally | |||||
| { | |||||
| gameMap.GameObjLockDict[GameObjType.Chest].ExitReadLock(); | |||||
| } | |||||
| Chest? chestToOpen = (Chest?)gameMap.OneForInteract(player.Position, GameObjType.Chest); | |||||
| if (chestToOpen == null || chestToOpen.IsOpen) | if (chestToOpen == null || chestToOpen.IsOpen) | ||||
| return false; | return false; | ||||
| @@ -203,8 +203,8 @@ namespace Server | |||||
| for (int i = 0; i < GameData.maxNumOfSkill - player.TimeUntilActiveSkillAvailable.Count(); ++i) | for (int i = 0; i < GameData.maxNumOfSkill - player.TimeUntilActiveSkillAvailable.Count(); ++i) | ||||
| msg.StudentMessage.TimeUntilSkillAvailable.Add(-1); | msg.StudentMessage.TimeUntilSkillAvailable.Add(-1); | ||||
| foreach (var Value in player.PropInventory) | |||||
| msg.StudentMessage.Prop.Add(ToPropType(Value.GetPropType())); | |||||
| foreach (var value in player.PropInventory) | |||||
| msg.StudentMessage.Prop.Add(ToPropType(value.GetPropType())); | |||||
| msg.StudentMessage.Place = ToPlaceType(player.Place); | msg.StudentMessage.Place = ToPlaceType(player.Place); | ||||
| msg.StudentMessage.Guid = player.ID; | msg.StudentMessage.Guid = player.ID; | ||||
| @@ -247,8 +247,8 @@ namespace Server | |||||
| msg.StudentMessage.TimeUntilSkillAvailable.Add(-1); | msg.StudentMessage.TimeUntilSkillAvailable.Add(-1); | ||||
| msg.TrickerMessage.Place = ToPlaceType(player.Place); | msg.TrickerMessage.Place = ToPlaceType(player.Place); | ||||
| foreach (var Value in player.PropInventory) | |||||
| msg.StudentMessage.Prop.Add(ToPropType(Value.GetPropType())); | |||||
| foreach (var value in player.PropInventory) | |||||
| msg.StudentMessage.Prop.Add(ToPropType(value.GetPropType())); | |||||
| msg.TrickerMessage.TrickerType = ToTrickerType(player.CharacterType); | msg.TrickerMessage.TrickerType = ToTrickerType(player.CharacterType); | ||||
| msg.TrickerMessage.Guid = player.ID; | msg.TrickerMessage.Guid = player.ID; | ||||
| @@ -28,7 +28,7 @@ | |||||
| - 只展示外部需要的属性,部分属性被省略 | - 只展示外部需要的属性,部分属性被省略 | ||||
| ### BgmType | ### BgmType | ||||
| - 枚举类BgmType | |||||
| - *枚举类BgmType* | |||||
| 1. 不详的感觉:监管者进入(求生者的警戒半径/监管者的隐蔽度)时,求生者收到;监管者距离求生者越近,Bgm音量越大。bgmVolume=(警戒半径/二者距离) | 1. 不详的感觉:监管者进入(求生者的警戒半径/监管者的隐蔽度)时,求生者收到;监管者距离求生者越近,Bgm音量越大。bgmVolume=(警戒半径/二者距离) | ||||
| 2. 期待搞事的感觉:求生者进入(监管者的警戒半径/求生者的隐蔽度)时,监管者收到;监管者距离求生者越近,Bgm音量越大。bgmVolume=(警戒半径/可被发觉的最近的求生者距离) | 2. 期待搞事的感觉:求生者进入(监管者的警戒半径/求生者的隐蔽度)时,监管者收到;监管者距离求生者越近,Bgm音量越大。bgmVolume=(警戒半径/可被发觉的最近的求生者距离) | ||||
| 3. 修理电机的声音: 监管者警戒半径内有电机正在被修理时收到;bgmVolume=(警戒半径*电机修理程度/二者距离)/10300000 | 3. 修理电机的声音: 监管者警戒半径内有电机正在被修理时收到;bgmVolume=(警戒半径*电机修理程度/二者距离)/10300000 | ||||
| @@ -135,7 +135,7 @@ | |||||
| - 沉迷游戏程度 | - 沉迷游戏程度 | ||||
| - 最大沉迷游戏程度 | - 最大沉迷游戏程度 | ||||
| - 被治疗程度 | - 被治疗程度 | ||||
| - *(去)救援(别人)程度* | |||||
| - *被救援程度* | |||||
| ### 搞蛋鬼:人物 | ### 搞蛋鬼:人物 | ||||
| 无 | 无 | ||||
| @@ -186,7 +186,6 @@ | |||||
| ### 箱子:物体 | ### 箱子:物体 | ||||
| - *是否开启* | - *是否开启* | ||||
| - *开箱进度* | - *开箱进度* | ||||
| - *是否正在被开启* | |||||
| ### 门:物体 | ### 门:物体 | ||||
| - *属于那个教学区* | - *属于那个教学区* | ||||