Skip to content

Commit 2b45544

Browse files
committed
添加 GameModeCommand
1 parent f6efc48 commit 2b45544

File tree

10 files changed

+173
-15
lines changed

10 files changed

+173
-15
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>netcoreapp2.0</TargetFramework>
5+
</PropertyGroup>
6+
7+
<ItemGroup>
8+
<ProjectReference Include="..\MineCase.Server.Grains\MineCase.Server.Grains.csproj" />
9+
<ProjectReference Include="..\MineCase.Server.Interfaces\MineCase.Server.Interfaces.csproj" />
10+
</ItemGroup>
11+
12+
</Project>
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using MineCase.Server.Game;
7+
using MineCase.Server.Game.Entities;
8+
using MineCase.Server.Game.Commands;
9+
10+
namespace MineCase.Server.Commands.Vanilla
11+
{
12+
public class GameModeCommand
13+
: SimpleCommand
14+
{
15+
public GameModeCommand()
16+
: base("gamemode", "Changes the player to a specific game mode")
17+
{
18+
}
19+
20+
public override async Task<bool> Execute(ICommandSender commandSender, IReadOnlyList<ICommandArgument> args)
21+
{
22+
var player = (IPlayer)commandSender;
23+
24+
if (args.Count < 1)
25+
{
26+
throw new CommandWrongUsageException(this, "Invalid arguments");
27+
}
28+
29+
GameMode.Class gameModeClass;
30+
31+
switch (((UnresolvedArgument)args[0]).RawContent)
32+
{
33+
case "survival":
34+
case "s":
35+
case "0":
36+
gameModeClass = GameMode.Class.Survival;
37+
break;
38+
case "creative":
39+
case "c":
40+
case "1":
41+
gameModeClass = GameMode.Class.Creative;
42+
break;
43+
case "adventure":
44+
case "ad":
45+
case "2":
46+
gameModeClass = GameMode.Class.Adventure;
47+
break;
48+
case "spectator":
49+
case "sp":
50+
case "3":
51+
gameModeClass = GameMode.Class.Spectator;
52+
break;
53+
default:
54+
throw new CommandWrongUsageException(this);
55+
}
56+
57+
var target = player;
58+
59+
if (args.Count == 2)
60+
{
61+
var rawArg = (UnresolvedArgument)args[1];
62+
63+
if (rawArg is TargetSelectorArgument targetSelector)
64+
{
65+
switch (targetSelector.Type)
66+
{
67+
case TargetSelectorType.NearestPlayer:
68+
break;
69+
case TargetSelectorType.RandomPlayer:
70+
break;
71+
case TargetSelectorType.AllPlayers:
72+
break;
73+
case TargetSelectorType.AllEntites:
74+
break;
75+
case TargetSelectorType.Executor:
76+
break;
77+
default:
78+
throw new CommandException(this);
79+
}
80+
81+
throw new CommandException(this, "Sorry, this feature has not been implemented.");
82+
}
83+
else
84+
{
85+
var user = await player.GetUser();
86+
var session = await user.GetGameSession();
87+
88+
target = await (await session.FindUserByName(rawArg.RawContent)).GetPlayer();
89+
90+
if (target == null)
91+
{
92+
throw new CommandException(this, $"Player \"{rawArg.RawContent}\" not found, may be offline or not existing.");
93+
}
94+
}
95+
}
96+
97+
var targetDesc = await target.GetDescription();
98+
var mode = targetDesc.GameMode;
99+
mode.ModeClass = gameModeClass;
100+
targetDesc.GameMode = mode;
101+
102+
return true;
103+
}
104+
}
105+
}

src/MineCase.Server.Grains/Game/Entities/PlayerGrain.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,12 +339,14 @@ private class WindowContext
339339

340340
public Task<bool> HasPermission(Permission permission)
341341
{
342-
throw new NotImplementedException();
342+
// TODO: 临时提供所有权限,需要实现权限管理
343+
return Task.FromResult(true);
343344
}
344345

345346
public Task SendMessage(string msg)
346347
{
347-
throw new NotImplementedException();
348+
// TODO: 向玩家发送信息
349+
return Task.CompletedTask;
348350
}
349351
}
350352
}

src/MineCase.Server.Grains/Game/GameSession.cs

Lines changed: 32 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,24 @@ public override async Task OnActivateAsync()
3434
_gameTick = RegisterTimer(OnGameTick, null, TimeSpan.Zero, TimeSpan.FromMilliseconds(50));
3535
}
3636

37+
public Task<IEnumerable<IUser>> GetUsers()
38+
{
39+
return Task.FromResult((IEnumerable<IUser>)_users.Keys);
40+
}
41+
42+
public async Task<IUser> FindUserByName(string name)
43+
{
44+
foreach (var user in _users)
45+
{
46+
if (await user.Key.GetName() == name)
47+
{
48+
return user.Key;
49+
}
50+
}
51+
52+
return null;
53+
}
54+
3755
public async Task JoinGame(IUser user)
3856
{
3957
var sink = await user.GetClientPacketSink();
@@ -97,8 +115,8 @@ public async Task SendChatMessage(IUser sender, IUser receiver, string message)
97115
var senderName = await sender.GetName();
98116
var receiverName = await receiver.GetName();
99117

100-
Chat jsonData = await CreateStandardChatMessage(senderName, message);
101-
byte position = 0; // It represents user message in chat box
118+
var jsonData = await CreateStandardChatMessage(senderName, message);
119+
const byte position = 0; // It represents user message in chat box
102120
foreach (var item in _users.Keys)
103121
{
104122
if (await item.GetName() == receiverName ||
@@ -123,20 +141,23 @@ await Task.WhenAll(from u in _tickables
123141

124142
private Task<Chat> CreateStandardChatMessage(string name, string message)
125143
{
126-
StringComponent nameComponent = new StringComponent(name);
127-
nameComponent.ClickEvent = new ChatClickEvent(ClickEventType.SuggestCommand, "/msg " + name);
128-
nameComponent.HoverEvent = new ChatHoverEvent(HoverEventType.ShowEntity, name);
129-
nameComponent.Insertion = name;
144+
var nameComponent = new StringComponent(name)
145+
{
146+
ClickEvent = new ChatClickEvent(ClickEventType.SuggestCommand, "/msg " + name),
147+
HoverEvent = new ChatHoverEvent(HoverEventType.ShowEntity, name),
148+
Insertion = name
149+
};
130150

131151
// construct message
132-
StringComponent messageComponent = new StringComponent(message);
152+
var messageComponent = new StringComponent(message);
133153

134154
// list
135-
List<ChatComponent> list = new List<ChatComponent>();
136-
list.Add(nameComponent);
137-
list.Add(messageComponent);
155+
var list = new List<ChatComponent>
156+
{
157+
nameComponent, messageComponent
158+
};
138159

139-
Chat jsonData = new Chat(new TranslationComponent("chat.type.text", list));
160+
var jsonData = new Chat(new TranslationComponent("chat.type.text", list));
140161
return Task.FromResult(jsonData);
141162
}
142163

src/MineCase.Server.Grains/World/WorldGrain.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ public Task<IEntity> FindEntity(uint eid)
4343
return Task.FromException<IEntity>(new EntityNotFoundException());
4444
}
4545

46+
public Task<IEnumerable<IEntity>> GetEntities()
47+
{
48+
return Task.FromResult((IEnumerable<IEntity>)_entities.Values);
49+
}
50+
4651
public Task<(long age, long timeOfDay)> GetTime()
4752
{
4853
return Task.FromResult((_worldAge, _worldAge % 24000));

src/MineCase.Server.Interfaces/Game/Commands/ICommand.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public interface ICommand
5454
/// <summary>
5555
/// 命令执行过程中可能发生的异常的基类
5656
/// </summary>
57-
/// <remarks>派生自此类的异常在 <see cref="M:MineCase.Server.Game.Commands.CommandMap.Dispatch(MineCase.Server.Game.Commands.ICommandSender,System.String)" /> 中将会被吃掉,不会传播到外部</remarks>
57+
/// <remarks>派生自此类的异常在 <see cref="CommandMap.Dispatch(ICommandSender, string)" /> 中将会被吃掉,不会传播到外部</remarks>
5858
public class CommandException : Exception
5959
{
6060
public ICommand Command { get; }

src/MineCase.Server.Interfaces/Game/Entities/IPlayer.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
using System.Threading.Tasks;
66

77
using MineCase.Protocol.Play;
8+
using MineCase.Server.Game.Commands;
89
using MineCase.Server.Game.Windows;
910
using MineCase.Server.Network;
1011
using MineCase.Server.User;

src/MineCase.Server.Interfaces/Game/IGameSession.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,10 @@ namespace MineCase.Server.Game
1111
{
1212
public interface IGameSession : IGrainWithStringKey
1313
{
14+
Task<IEnumerable<IUser>> GetUsers();
15+
16+
Task<IUser> FindUserByName(string name);
17+
1418
Task JoinGame(IUser player);
1519

1620
Task LeaveGame(IUser player);

src/MineCase.Server.Interfaces/World/IWorld.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public interface IWorld : IGrainWithStringKey
1717

1818
Task<IEntity> FindEntity(uint eid);
1919

20+
Task<IEnumerable<IEntity>> GetEntities();
21+
2022
Task<(long age, long timeOfDay)> GetTime();
2123

2224
Task<long> GetAge();

src/MineCase.sln

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
Microsoft Visual Studio Solution File, Format Version 12.00
33
# Visual Studio 15
4-
VisualStudioVersion = 15.0.26730.12
4+
VisualStudioVersion = 15.0.26730.15
55
MinimumVisualStudioVersion = 10.0.40219.1
66
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MineCase.Server", "MineCase.Server\MineCase.Server.csproj", "{8E71CBEC-5804-4125-B651-C78426E57C8C}"
77
EndProject
@@ -38,6 +38,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "data", "data", "{7DC8CDBD-0
3838
..\data\furnace.txt = ..\data\furnace.txt
3939
EndProjectSection
4040
EndProject
41+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MineCase.Commands", "MineCase.Commands\MineCase.Commands.csproj", "{A56AEC13-918A-4A54-94DA-7CE8F01C378B}"
42+
EndProject
4143
Global
4244
GlobalSection(SolutionConfigurationPlatforms) = preSolution
4345
Debug|Any CPU = Debug|Any CPU
@@ -80,6 +82,10 @@ Global
8082
{B7B1A959-72F3-42C6-B138-93C8D654F139}.Debug|Any CPU.Build.0 = Debug|Any CPU
8183
{B7B1A959-72F3-42C6-B138-93C8D654F139}.Release|Any CPU.ActiveCfg = Release|Any CPU
8284
{B7B1A959-72F3-42C6-B138-93C8D654F139}.Release|Any CPU.Build.0 = Release|Any CPU
85+
{A56AEC13-918A-4A54-94DA-7CE8F01C378B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
86+
{A56AEC13-918A-4A54-94DA-7CE8F01C378B}.Debug|Any CPU.Build.0 = Debug|Any CPU
87+
{A56AEC13-918A-4A54-94DA-7CE8F01C378B}.Release|Any CPU.ActiveCfg = Release|Any CPU
88+
{A56AEC13-918A-4A54-94DA-7CE8F01C378B}.Release|Any CPU.Build.0 = Release|Any CPU
8389
EndGlobalSection
8490
GlobalSection(SolutionProperties) = preSolution
8591
HideSolutionNode = FALSE

0 commit comments

Comments
 (0)