mirror of
https://github.com/Alex-Rachel/TEngine.git
synced 2025-08-14 16:51:28 +00:00
[+] 接入ET8服务端
[+] 接入ET8服务端
This commit is contained in:
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 026ceb4c7b1a5b7439ad918fc35f7e0a
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,52 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Net.Sockets;
|
||||
using ET.Client;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[EntitySystemOf(typeof(BenchmarkClientComponent))]
|
||||
public static partial class BenchmarkClientComponentSystem
|
||||
{
|
||||
[EntitySystem]
|
||||
private static void Awake(this BenchmarkClientComponent self)
|
||||
{
|
||||
for (int i = 0; i < 50; ++i)
|
||||
{
|
||||
self.Start().Coroutine();
|
||||
}
|
||||
}
|
||||
|
||||
private static async ETTask Start(this BenchmarkClientComponent self)
|
||||
{
|
||||
await ETTask.CompletedTask;
|
||||
/*
|
||||
await self.Fiber().GetComponent<TimerComponent>().WaitAsync(1000);
|
||||
|
||||
|
||||
|
||||
Scene scene = await SceneFactory.CreateServerScene(self, self.Fiber().IdGenerater.GenerateId(), self.Fiber().IdGenerater.GenerateInstanceId(),
|
||||
self.DomainZone(), "bechmark", SceneType.Benchmark);
|
||||
|
||||
Client.NetClientComponent netClientComponent = scene.AddComponent<Client.NetClientComponent, AddressFamily>(AddressFamily.InterNetwork);
|
||||
|
||||
using Session session = netClientComponent.Create(StartSceneConfigCategory.Instance.BenchmarkServer.OuterIPPort);
|
||||
List<ETTask> list = new List<ETTask>(100000);
|
||||
|
||||
async ETTask Call(Session s)
|
||||
{
|
||||
using G2C_Benchmark benchmark = await s.Call(C2G_Benchmark.Create(true)) as G2C_Benchmark;
|
||||
}
|
||||
|
||||
for (int j = 0; j < 100000000; ++j)
|
||||
{
|
||||
list.Clear();
|
||||
for (int i = 0; i < list.Capacity; ++i)
|
||||
{
|
||||
list.Add(Call(session));
|
||||
}
|
||||
await ETTaskHelper.WaitAll(list);
|
||||
}
|
||||
*/
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9a7a85a66452bf3488c137e5c2caaf2a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,19 @@
|
||||
using System;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[MessageHandler(SceneType.BenchmarkServer)]
|
||||
public class C2G_BenchmarkHandler: MessageHandler<C2G_Benchmark, G2C_Benchmark>
|
||||
{
|
||||
protected override async ETTask Run(Session session, C2G_Benchmark request, G2C_Benchmark response)
|
||||
{
|
||||
using C2G_Benchmark _ = request;
|
||||
BenchmarkServerComponent benchmarkServerComponent = session.Scene().GetComponent<BenchmarkServerComponent>();
|
||||
if (benchmarkServerComponent.Count++ % 1000000 == 0)
|
||||
{
|
||||
Log.Debug($"benchmark count: {benchmarkServerComponent.Count} {session.Fiber().TimeInfo.ClientNow()}");
|
||||
}
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f26aed201cdde2142bab5f5c301087e9
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[Event(SceneType.Main)]
|
||||
public class EntryEvent2_InitServer: AEvent<Scene, ET.EventType.EntryEvent2>
|
||||
{
|
||||
protected override async ETTask Run(Scene root, ET.EventType.EntryEvent2 args)
|
||||
{
|
||||
World.Instance.AddSingleton<HttpDispatcher>();
|
||||
World.Instance.AddSingleton<ConsoleDispatcher>();
|
||||
|
||||
switch (Options.Instance.AppType)
|
||||
{
|
||||
case AppType.Server:
|
||||
{
|
||||
// 根据配置创建纤程
|
||||
var processScenes = StartSceneConfigCategory.Instance.GetByProcess(root.Fiber().Process);
|
||||
foreach (StartSceneConfig startConfig in processScenes)
|
||||
{
|
||||
await FiberManager.Instance.Create(SchedulerType.ThreadPool, startConfig.Id, startConfig.Zone, startConfig.Type, startConfig.Name);
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case AppType.Watcher:
|
||||
{
|
||||
root.AddComponent<WatcherComponent>();
|
||||
break;
|
||||
}
|
||||
case AppType.GameTool:
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (Options.Instance.Console == 1)
|
||||
{
|
||||
root.AddComponent<ConsoleComponent>();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 38ab027e1bcebae4992db7e8e2552667
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Gate.meta
Normal file
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Gate.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1513fb8025bddeb49b07673e0fbcf7b5
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,26 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
[MessageHandler(SceneType.Gate)]
|
||||
public class C2G_EnterMapHandler : MessageHandler<C2G_EnterMap, G2C_EnterMap>
|
||||
{
|
||||
protected override async ETTask Run(Session session, C2G_EnterMap request, G2C_EnterMap response)
|
||||
{
|
||||
Player player = session.GetComponent<SessionPlayerComponent>().Player;
|
||||
|
||||
// 在Gate上动态创建一个Map Scene,把Unit从DB中加载放进来,然后传送到真正的Map中,这样登陆跟传送的逻辑就完全一样了
|
||||
GateMapComponent gateMapComponent = player.AddComponent<GateMapComponent>();
|
||||
gateMapComponent.Scene = await GateMapFactory.Create(gateMapComponent, player.Id, session.Fiber().IdGenerater.GenerateInstanceId(), "GateMap");
|
||||
|
||||
Scene scene = gateMapComponent.Scene;
|
||||
|
||||
// 这里可以从DB中加载Unit
|
||||
Unit unit = UnitFactory.Create(scene, player.Id, UnitType.Player);
|
||||
|
||||
StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(session.Zone(), "Map1");
|
||||
response.MyId = player.Id;
|
||||
|
||||
// 等到一帧的最后面再传送,先让G2C_EnterMap返回,否则传送消息可能比G2C_EnterMap还早
|
||||
TransferHelper.TransferAtFrameFinish(unit, startSceneConfig.ActorId, startSceneConfig.Name).Coroutine();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4f713fa291a92de45b5676bf54630e83
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,73 @@
|
||||
using System;
|
||||
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[MessageHandler(SceneType.Gate)]
|
||||
public class C2G_LoginGateHandler : MessageHandler<C2G_LoginGate, G2C_LoginGate>
|
||||
{
|
||||
protected override async ETTask Run(Session session, C2G_LoginGate request, G2C_LoginGate response)
|
||||
{
|
||||
Scene root = session.Root();
|
||||
string account = root.GetComponent<GateSessionKeyComponent>().Get(request.Key);
|
||||
if (account == null)
|
||||
{
|
||||
response.Error = ErrorCore.ERR_ConnectGateKeyError;
|
||||
response.Message = "Gate key验证失败!";
|
||||
return;
|
||||
}
|
||||
|
||||
session.RemoveComponent<SessionAcceptTimeoutComponent>();
|
||||
|
||||
PlayerComponent playerComponent = root.GetComponent<PlayerComponent>();
|
||||
Player player = playerComponent.GetByAccount(account);
|
||||
if (player == null)
|
||||
{
|
||||
player = playerComponent.AddChild<Player, string>(account);
|
||||
playerComponent.Add(player);
|
||||
PlayerSessionComponent playerSessionComponent = player.AddComponent<PlayerSessionComponent>();
|
||||
playerSessionComponent.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.GateSession);
|
||||
await playerSessionComponent.AddLocation(LocationType.GateSession);
|
||||
|
||||
player.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
|
||||
await player.AddLocation(LocationType.Player);
|
||||
|
||||
session.AddComponent<SessionPlayerComponent>().Player = player;
|
||||
playerSessionComponent.Session = session;
|
||||
}
|
||||
else
|
||||
{
|
||||
// 判断是否在战斗
|
||||
PlayerRoomComponent playerRoomComponent = player.GetComponent<PlayerRoomComponent>();
|
||||
if (playerRoomComponent.RoomActorId != default)
|
||||
{
|
||||
CheckRoom(player, session).Coroutine();
|
||||
}
|
||||
else
|
||||
{
|
||||
PlayerSessionComponent playerSessionComponent = player.GetComponent<PlayerSessionComponent>();
|
||||
playerSessionComponent.Session = session;
|
||||
}
|
||||
}
|
||||
|
||||
response.PlayerId = player.Id;
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
|
||||
private static async ETTask CheckRoom(Player player, Session session)
|
||||
{
|
||||
Fiber fiber = player.Fiber();
|
||||
await fiber.WaitFrameFinish();
|
||||
|
||||
using Room2G_Reconnect room2GateReconnect = await fiber.Root.GetComponent<ActorSenderComponent>().Call(
|
||||
player.GetComponent<PlayerRoomComponent>().RoomActorId,
|
||||
new G2Room_Reconnect() { PlayerId = player.Id }) as Room2G_Reconnect;
|
||||
G2C_Reconnect g2CReconnect = new() { StartTime = room2GateReconnect.StartTime, Frame = room2GateReconnect.Frame };
|
||||
g2CReconnect.UnitInfos.AddRange(room2GateReconnect.UnitInfos);
|
||||
session.Send(g2CReconnect);
|
||||
|
||||
session.AddComponent<SessionPlayerComponent>().Player = player;
|
||||
player.GetComponent<PlayerSessionComponent>().Session = session;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 4486ddc371c9d0d4489f7826dbe00eff
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,15 @@
|
||||
using System;
|
||||
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[MessageHandler(SceneType.Gate)]
|
||||
public class C2G_PingHandler : MessageHandler<C2G_Ping, G2C_Ping>
|
||||
{
|
||||
protected override async ETTask Run(Session session, C2G_Ping request, G2C_Ping response)
|
||||
{
|
||||
response.Time = session.Fiber().TimeInfo.ServerNow();
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8679dc7d3ea6fe4478111d3d3948d6cc
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,26 @@
|
||||
using System.Net;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[Invoke((long)SceneType.Gate)]
|
||||
public class FiberInit_Gate: AInvokeHandler<FiberInit, ETTask>
|
||||
{
|
||||
public override async ETTask Handle(FiberInit fiberInit)
|
||||
{
|
||||
Scene root = fiberInit.Fiber.Root;
|
||||
root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
|
||||
root.AddComponent<TimerComponent>();
|
||||
root.AddComponent<CoroutineLockComponent>();
|
||||
root.AddComponent<ActorInnerComponent>();
|
||||
root.AddComponent<ActorSenderComponent>();
|
||||
root.AddComponent<PlayerComponent>();
|
||||
root.AddComponent<GateSessionKeyComponent>();
|
||||
root.AddComponent<LocationProxyComponent>();
|
||||
root.AddComponent<ActorLocationSenderComponent>();
|
||||
|
||||
StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.Get((int)root.Id);
|
||||
root.AddComponent<NetServerComponent, IPEndPoint>(startSceneConfig.InnerIPPort);
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ca25ecd7aaadcc449a2f8417afa3db67
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,20 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
public static class GateMapFactory
|
||||
{
|
||||
public static async ETTask<Scene> Create(Entity parent, long id, long instanceId, string name)
|
||||
{
|
||||
await ETTask.CompletedTask;
|
||||
Scene scene = EntitySceneFactory.CreateScene(parent, id, instanceId, SceneType.Map, name);
|
||||
|
||||
scene.AddComponent<UnitComponent>();
|
||||
scene.AddComponent<AOIManagerComponent>();
|
||||
scene.AddComponent<RoomManagerComponent>();
|
||||
|
||||
scene.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
|
||||
|
||||
return scene;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b5df8fb8c84869f4ea1310d4a0839013
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,30 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
[FriendOf(typeof(GateSessionKeyComponent))]
|
||||
public static partial class GateSessionKeyComponentSystem
|
||||
{
|
||||
public static void Add(this GateSessionKeyComponent self, long key, string account)
|
||||
{
|
||||
self.sessionKey.Add(key, account);
|
||||
self.TimeoutRemoveKey(key).Coroutine();
|
||||
}
|
||||
|
||||
public static string Get(this GateSessionKeyComponent self, long key)
|
||||
{
|
||||
string account = null;
|
||||
self.sessionKey.TryGetValue(key, out account);
|
||||
return account;
|
||||
}
|
||||
|
||||
public static void Remove(this GateSessionKeyComponent self, long key)
|
||||
{
|
||||
self.sessionKey.Remove(key);
|
||||
}
|
||||
|
||||
private static async ETTask TimeoutRemoveKey(this GateSessionKeyComponent self, long key)
|
||||
{
|
||||
await self.Fiber().TimerComponent.WaitAsync(20000);
|
||||
self.sessionKey.Remove(key);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fc5df5d6f1eb16d4fb5aed2972a96bb6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,19 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
[Invoke((long)MailBoxType.GateSession)]
|
||||
public class MailBoxType_GateSessionHandler: AInvokeHandler<MailBoxInvoker>
|
||||
{
|
||||
public override void Handle(MailBoxInvoker args)
|
||||
{
|
||||
MailBoxComponent mailBoxComponent = args.MailBoxComponent;
|
||||
|
||||
// 这里messageObject要发送出去,不能回收
|
||||
MessageObject messageObject = args.MessageObject;
|
||||
|
||||
if (mailBoxComponent.Parent is PlayerSessionComponent playerSessionComponent)
|
||||
{
|
||||
playerSessionComponent.Session?.Send(messageObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abf1c389d130cf6409d8d6a79f11d324
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,75 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
[Event(SceneType.Realm | SceneType.Gate)]
|
||||
public class NetServerComponentOnReadEvent: AEvent<Scene, NetServerComponentOnRead>
|
||||
{
|
||||
protected override async ETTask Run(Scene scene, NetServerComponentOnRead args)
|
||||
{
|
||||
Session session = args.Session;
|
||||
object message = args.Message;
|
||||
Scene root = scene.Root();
|
||||
|
||||
if (message is IResponse response)
|
||||
{
|
||||
session.OnResponse(response);
|
||||
return;
|
||||
}
|
||||
|
||||
// 根据消息接口判断是不是Actor消息,不同的接口做不同的处理,比如需要转发给Chat Scene,可以做一个IChatMessage接口
|
||||
switch (message)
|
||||
{
|
||||
case FrameMessage frameMessage:
|
||||
{
|
||||
Player player = session.GetComponent<SessionPlayerComponent>().Player;
|
||||
ActorId roomActorId = player.GetComponent<PlayerRoomComponent>().RoomActorId;
|
||||
frameMessage.PlayerId = player.Id;
|
||||
root.GetComponent<ActorSenderComponent>().Send(roomActorId, frameMessage);
|
||||
break;
|
||||
}
|
||||
case IActorRoom actorRoom:
|
||||
{
|
||||
Player player = session.GetComponent<SessionPlayerComponent>().Player;
|
||||
ActorId roomActorId = player.GetComponent<PlayerRoomComponent>().RoomActorId;
|
||||
actorRoom.PlayerId = player.Id;
|
||||
root.GetComponent<ActorSenderComponent>().Send(roomActorId, actorRoom);
|
||||
break;
|
||||
}
|
||||
case IActorLocationMessage actorLocationMessage:
|
||||
{
|
||||
long unitId = session.GetComponent<SessionPlayerComponent>().Player.Id;
|
||||
root.GetComponent<ActorLocationSenderComponent>().Get(LocationType.Unit).Send(unitId, actorLocationMessage);
|
||||
break;
|
||||
}
|
||||
case IActorLocationRequest actorLocationRequest: // gate session收到actor rpc消息,先向actor 发送rpc请求,再将请求结果返回客户端
|
||||
{
|
||||
long unitId = session.GetComponent<SessionPlayerComponent>().Player.Id;
|
||||
int rpcId = actorLocationRequest.RpcId; // 这里要保存客户端的rpcId
|
||||
long instanceId = session.InstanceId;
|
||||
IResponse iResponse = await root.GetComponent<ActorLocationSenderComponent>().Get(LocationType.Unit).Call(unitId, actorLocationRequest);
|
||||
iResponse.RpcId = rpcId;
|
||||
// session可能已经断开了,所以这里需要判断
|
||||
if (session.InstanceId == instanceId)
|
||||
{
|
||||
session.Send(iResponse);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case IActorRequest actorRequest: // 分发IActorRequest消息,目前没有用到,需要的自己添加
|
||||
{
|
||||
break;
|
||||
}
|
||||
case IActorMessage actorMessage: // 分发IActorMessage消息,目前没有用到,需要的自己添加
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
// 非Actor消息
|
||||
MessageDispatcherComponent.Instance.Handle(session, message);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d8d62222c52da1d43975f204b0d24b07
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,25 @@
|
||||
using System.Linq;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[FriendOf(typeof(PlayerComponent))]
|
||||
public static partial class PlayerComponentSystem
|
||||
{
|
||||
public static void Add(this PlayerComponent self, Player player)
|
||||
{
|
||||
self.dictionary.Add(player.Account, player);
|
||||
}
|
||||
|
||||
public static void Remove(this PlayerComponent self, Player player)
|
||||
{
|
||||
self.dictionary.Remove(player.Account);
|
||||
player.Dispose();
|
||||
}
|
||||
|
||||
public static Player GetByAccount(this PlayerComponent self, string account)
|
||||
{
|
||||
self.dictionary.TryGetValue(account, out Player player);
|
||||
return player;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 140ad5927b1206842a0d4eb4024ec059
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,13 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
[EntitySystemOf(typeof(Player))]
|
||||
[FriendOf(typeof(Player))]
|
||||
public static partial class PlayerSystem
|
||||
{
|
||||
[EntitySystem]
|
||||
private static void Awake(this Player self, string a)
|
||||
{
|
||||
self.Account = a;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3eed1c782eb930d41aa33b6967a6b344
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,18 @@
|
||||
using System;
|
||||
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageHandler(SceneType.Gate)]
|
||||
public class R2G_GetLoginKeyHandler : ActorMessageHandler<Scene, R2G_GetLoginKey, G2R_GetLoginKey>
|
||||
{
|
||||
protected override async ETTask Run(Scene scene, R2G_GetLoginKey request, G2R_GetLoginKey response)
|
||||
{
|
||||
long key = RandomGenerator.RandInt64();
|
||||
scene.GetComponent<GateSessionKeyComponent>().Add(key, request.Account);
|
||||
response.Key = key;
|
||||
response.GateId = scene.Id;
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a24713aa9a3f4eb47ab569ba6919599c
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,24 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
[EntitySystemOf(typeof(SessionPlayerComponent))]
|
||||
public static partial class SessionPlayerComponentSystem
|
||||
{
|
||||
[EntitySystem]
|
||||
private static void Destroy(this SessionPlayerComponent self)
|
||||
{
|
||||
Scene root = self.Root();
|
||||
if (root.IsDisposed)
|
||||
{
|
||||
return;
|
||||
}
|
||||
// 发送断线消息
|
||||
root.GetComponent<ActorLocationSenderComponent>().Get(LocationType.Unit).Send(self.Player.Id, new G2M_SessionDisconnect());
|
||||
}
|
||||
|
||||
[EntitySystem]
|
||||
private static void Awake(this SessionPlayerComponent self)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c6ffc219f113f5d4e9b93e02d18e6cee
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
17
Assets/GameScripts/DotNet/Hotfix/Server/Demo/HttpHelper.cs
Normal file
17
Assets/GameScripts/DotNet/Hotfix/Server/Demo/HttpHelper.cs
Normal file
@@ -0,0 +1,17 @@
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
public static partial class HttpHelper
|
||||
{
|
||||
public static void Response(HttpListenerContext context, object response)
|
||||
{
|
||||
byte[] bytes = MongoHelper.ToJson(response).ToUtf8();
|
||||
context.Response.StatusCode = 200;
|
||||
context.Response.ContentEncoding = Encoding.UTF8;
|
||||
context.Response.ContentLength64 = bytes.Length;
|
||||
context.Response.OutputStream.Write(bytes, 0, bytes.Length);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4a6cc30502b32b44b6f536b3fba5756
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Map.meta
Normal file
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Map.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 0beef288928e88b4d8cad09b6a39c25d
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6047e4105251a574695322acaa6ab8b3
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,31 @@
|
||||
using Unity.Mathematics;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[Event(SceneType.Map)]
|
||||
public class ChangePosition_NotifyAOI: AEvent<Scene, ET.EventType.ChangePosition>
|
||||
{
|
||||
protected override async ETTask Run(Scene scene, ET.EventType.ChangePosition args)
|
||||
{
|
||||
Unit unit = args.Unit;
|
||||
float3 oldPos = args.OldPos;
|
||||
int oldCellX = (int) (oldPos.x * 1000) / AOIManagerComponent.CellSize;
|
||||
int oldCellY = (int) (oldPos.z * 1000) / AOIManagerComponent.CellSize;
|
||||
int newCellX = (int) (unit.Position.x * 1000) / AOIManagerComponent.CellSize;
|
||||
int newCellY = (int) (unit.Position.z * 1000) / AOIManagerComponent.CellSize;
|
||||
if (oldCellX == newCellX && oldCellY == newCellY)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
AOIEntity aoiEntity = unit.GetComponent<AOIEntity>();
|
||||
if (aoiEntity == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
unit.Scene().GetComponent<AOIManagerComponent>().Move(aoiEntity, newCellX, newCellY);
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 071b14f170a41df40be9d446a366f90e
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageLocationHandler(SceneType.Map)]
|
||||
public class C2M_TestRobotCaseHandler : ActorMessageLocationHandler<Unit, C2M_TestRobotCase, M2C_TestRobotCase>
|
||||
{
|
||||
protected override async ETTask Run(Unit unit, C2M_TestRobotCase request, M2C_TestRobotCase response)
|
||||
{
|
||||
response.N = request.N;
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5779b882127d20f41a9e4d9e48bb8dcf
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,13 @@
|
||||
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageLocationHandler(SceneType.Map)]
|
||||
public class G2M_SessionDisconnectHandler : ActorMessageLocationHandler<Unit, G2M_SessionDisconnect>
|
||||
{
|
||||
protected override async ETTask Run(Unit unit, G2M_SessionDisconnect message)
|
||||
{
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba011d050583a53499952147c5fad840
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3aa2b5e0132eb714ab53a38e8c6f7e10
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,13 @@
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageLocationHandler(SceneType.Map)]
|
||||
public class C2M_PathfindingResultHandler : ActorMessageLocationHandler<Unit, C2M_PathfindingResult>
|
||||
{
|
||||
protected override async ETTask Run(Unit unit, C2M_PathfindingResult message)
|
||||
{
|
||||
unit.FindPathMoveToAsync(message.Position).Coroutine();
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bedd38d8adf8fb147925d5091bdc6ec7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,12 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageLocationHandler(SceneType.Map)]
|
||||
public class C2M_StopHandler: ActorMessageLocationHandler<Unit, C2M_Stop>
|
||||
{
|
||||
protected override async ETTask Run(Unit unit, C2M_Stop message)
|
||||
{
|
||||
unit.Stop(1);
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 82030ce8c55952d4281c067ab368ef72
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,58 @@
|
||||
using System.Collections.Generic;
|
||||
using Unity.Mathematics;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
public static partial class MoveHelper
|
||||
{
|
||||
// 可以多次调用,多次调用的话会取消上一次的协程
|
||||
public static async ETTask FindPathMoveToAsync(this Unit unit, float3 target)
|
||||
{
|
||||
float speed = unit.GetComponent<NumericComponent>().GetAsFloat(NumericType.Speed);
|
||||
if (speed < 0.01)
|
||||
{
|
||||
unit.SendStop(2);
|
||||
return;
|
||||
}
|
||||
|
||||
M2C_PathfindingResult m2CPathfindingResult = new();
|
||||
unit.GetComponent<PathfindingComponent>().Find(unit.Position, target, m2CPathfindingResult.Points);
|
||||
|
||||
if (m2CPathfindingResult.Points.Count < 2)
|
||||
{
|
||||
unit.SendStop(3);
|
||||
return;
|
||||
}
|
||||
|
||||
// 广播寻路路径
|
||||
m2CPathfindingResult.Id = unit.Id;
|
||||
MessageHelper.Broadcast(unit, m2CPathfindingResult);
|
||||
|
||||
MoveComponent moveComponent = unit.GetComponent<MoveComponent>();
|
||||
|
||||
bool ret = await moveComponent.MoveToAsync(m2CPathfindingResult.Points, speed);
|
||||
if (ret) // 如果返回false,说明被其它移动取消了,这时候不需要通知客户端stop
|
||||
{
|
||||
unit.SendStop(0);
|
||||
}
|
||||
}
|
||||
|
||||
public static void Stop(this Unit unit, int error)
|
||||
{
|
||||
unit.GetComponent<MoveComponent>().Stop(error == 0);
|
||||
unit.SendStop(error);
|
||||
}
|
||||
|
||||
// error: 0表示协程走完正常停止
|
||||
public static void SendStop(this Unit unit, int error)
|
||||
{
|
||||
MessageHelper.Broadcast(unit, new M2C_Stop()
|
||||
{
|
||||
Error = error,
|
||||
Id = unit.Id,
|
||||
Position = unit.Position,
|
||||
Rotation = unit.Rotation,
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1126c2d3180a6f1419a44335fc0f0f12
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 976f21a6abc312d42ad4bf8078438054
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,28 @@
|
||||
using System;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageLocationHandler(SceneType.Map)]
|
||||
public class C2M_TransferMapHandler : ActorMessageLocationHandler<Unit, C2M_TransferMap, M2C_TransferMap>
|
||||
{
|
||||
protected override async ETTask Run(Unit unit, C2M_TransferMap request, M2C_TransferMap response)
|
||||
{
|
||||
await ETTask.CompletedTask;
|
||||
|
||||
string currentMap = unit.Scene().Name;
|
||||
string toMap = null;
|
||||
if (currentMap == "Map1")
|
||||
{
|
||||
toMap = "Map2";
|
||||
}
|
||||
else
|
||||
{
|
||||
toMap = "Map1";
|
||||
}
|
||||
|
||||
StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.GetBySceneName(unit.Fiber().Zone, toMap);
|
||||
|
||||
TransferHelper.TransferAtFrameFinish(unit, startSceneConfig.ActorId, toMap).Coroutine();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09e1381365665c14aaa410513c72dbb1
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,45 @@
|
||||
using System;
|
||||
using Unity.Mathematics;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ActorMessageHandler(SceneType.Map)]
|
||||
public class M2M_UnitTransferRequestHandler: ActorMessageHandler<Scene, M2M_UnitTransferRequest, M2M_UnitTransferResponse>
|
||||
{
|
||||
protected override async ETTask Run(Scene scene, M2M_UnitTransferRequest request, M2M_UnitTransferResponse response)
|
||||
{
|
||||
UnitComponent unitComponent = scene.GetComponent<UnitComponent>();
|
||||
Unit unit = MongoHelper.Deserialize<Unit>(request.Unit);
|
||||
|
||||
unitComponent.AddChild(unit);
|
||||
unitComponent.Add(unit);
|
||||
|
||||
foreach (byte[] bytes in request.Entitys)
|
||||
{
|
||||
Entity entity = MongoHelper.Deserialize<Entity>(bytes);
|
||||
unit.AddComponent(entity);
|
||||
}
|
||||
|
||||
unit.AddComponent<MoveComponent>();
|
||||
unit.AddComponent<PathfindingComponent, string>(scene.Name);
|
||||
unit.Position = new float3(-10, 0, -10);
|
||||
|
||||
unit.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.OrderedMessage);
|
||||
|
||||
// 通知客户端开始切场景
|
||||
M2C_StartSceneChange m2CStartSceneChange = new() { SceneInstanceId = scene.InstanceId, SceneName = scene.Name };
|
||||
MessageHelper.SendToClient(unit, m2CStartSceneChange);
|
||||
|
||||
// 通知客户端创建My Unit
|
||||
M2C_CreateMyUnit m2CCreateUnits = new();
|
||||
m2CCreateUnits.Unit = UnitHelper.CreateUnitInfo(unit);
|
||||
MessageHelper.SendToClient(unit, m2CCreateUnits);
|
||||
|
||||
// 加入aoi
|
||||
unit.AddComponent<AOIEntity, int, float3>(9 * 1000, unit.Position);
|
||||
|
||||
// 解锁location,可以接收发给Unit的消息
|
||||
await scene.Root().GetComponent<LocationProxyComponent>().UnLock(LocationType.Unit, unit.Id, request.OldActorId, unit.GetActorId());
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e8e9b12c47eb5ac41b42a6b83817f1d2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,39 @@
|
||||
using System.Collections.Generic;
|
||||
using MongoDB.Bson;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
public static partial class TransferHelper
|
||||
{
|
||||
public static async ETTask TransferAtFrameFinish(Unit unit, ActorId sceneInstanceId, string sceneName)
|
||||
{
|
||||
await unit.Fiber().WaitFrameFinish();
|
||||
|
||||
await TransferHelper.Transfer(unit, sceneInstanceId, sceneName);
|
||||
}
|
||||
|
||||
|
||||
public static async ETTask Transfer(Unit unit, ActorId sceneInstanceId, string sceneName)
|
||||
{
|
||||
Scene root = unit.Root();
|
||||
|
||||
// location加锁
|
||||
long unitId = unit.Id;
|
||||
|
||||
M2M_UnitTransferRequest request = M2M_UnitTransferRequest.Create();
|
||||
request.OldActorId = unit.GetActorId();
|
||||
request.Unit = unit.ToBson();
|
||||
foreach (Entity entity in unit.Components.Values)
|
||||
{
|
||||
if (entity is ITransfer)
|
||||
{
|
||||
request.Entitys.Add(entity.ToBson());
|
||||
}
|
||||
}
|
||||
unit.Dispose();
|
||||
|
||||
await root.GetComponent<LocationProxyComponent>().Lock(LocationType.Unit, unitId, request.OldActorId);
|
||||
await root.GetComponent<ActorSenderComponent>().Call(sceneInstanceId, request);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6fe1b54e7a5a88243a60c501d7a71979
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 90f2084c2789e40468c6eb5642275748
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,29 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
// 进入视野通知
|
||||
[Event(SceneType.Map)]
|
||||
public class UnitEnterSightRange_NotifyClient: AEvent<Scene, EventType.UnitEnterSightRange>
|
||||
{
|
||||
protected override async ETTask Run(Scene scene, EventType.UnitEnterSightRange args)
|
||||
{
|
||||
AOIEntity a = args.A;
|
||||
AOIEntity b = args.B;
|
||||
if (a.Id == b.Id)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Unit ua = a.GetParent<Unit>();
|
||||
if (ua.Type != UnitType.Player)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Unit ub = b.GetParent<Unit>();
|
||||
|
||||
MessageHelper.NoticeUnitAdd(ua, ub);
|
||||
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 92a7bfbd50423e64b994beb9fe3ddad2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,33 @@
|
||||
using System;
|
||||
using Unity.Mathematics;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
public static partial class UnitFactory
|
||||
{
|
||||
public static Unit Create(Scene scene, long id, UnitType unitType)
|
||||
{
|
||||
UnitComponent unitComponent = scene.GetComponent<UnitComponent>();
|
||||
switch (unitType)
|
||||
{
|
||||
case UnitType.Player:
|
||||
{
|
||||
Unit unit = unitComponent.AddChildWithId<Unit, int>(id, 1001);
|
||||
unit.AddComponent<MoveComponent>();
|
||||
unit.Position = new float3(-10, 0, -10);
|
||||
|
||||
NumericComponent numericComponent = unit.AddComponent<NumericComponent>();
|
||||
numericComponent.Set(NumericType.Speed, 6f); // 速度是6米每秒
|
||||
numericComponent.Set(NumericType.AOI, 15000); // 视野15米
|
||||
|
||||
unitComponent.Add(unit);
|
||||
// 加入aoi
|
||||
unit.AddComponent<AOIEntity, int, float3>(9 * 1000, unit.Position);
|
||||
return unit;
|
||||
}
|
||||
default:
|
||||
throw new Exception($"not such unit type: {unitType}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 359d93a0f7fdfa44bbc572328e9742f3
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,49 @@
|
||||
using System.Collections.Generic;
|
||||
using Unity.Mathematics;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[FriendOf(typeof(MoveComponent))]
|
||||
[FriendOf(typeof(NumericComponent))]
|
||||
public static partial class UnitHelper
|
||||
{
|
||||
public static UnitInfo CreateUnitInfo(Unit unit)
|
||||
{
|
||||
UnitInfo unitInfo = new();
|
||||
NumericComponent nc = unit.GetComponent<NumericComponent>();
|
||||
unitInfo.UnitId = unit.Id;
|
||||
unitInfo.ConfigId = unit.ConfigId;
|
||||
unitInfo.Type = (int)unit.Type;
|
||||
unitInfo.Position = unit.Position;
|
||||
unitInfo.Forward = unit.Forward;
|
||||
|
||||
MoveComponent moveComponent = unit.GetComponent<MoveComponent>();
|
||||
if (moveComponent != null)
|
||||
{
|
||||
if (!moveComponent.IsArrived())
|
||||
{
|
||||
unitInfo.MoveInfo = new MoveInfo();
|
||||
unitInfo.MoveInfo.Points.Add(unit.Position);
|
||||
for (int i = moveComponent.N; i < moveComponent.Targets.Count; ++i)
|
||||
{
|
||||
float3 pos = moveComponent.Targets[i];
|
||||
unitInfo.MoveInfo.Points.Add(pos);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach ((int key, long value) in nc.NumericDic)
|
||||
{
|
||||
unitInfo.KV.Add(key, value);
|
||||
}
|
||||
|
||||
return unitInfo;
|
||||
}
|
||||
|
||||
// 获取看见unit的玩家,主要用于广播
|
||||
public static Dictionary<long, AOIEntity> GetBeSeePlayers(this Unit self)
|
||||
{
|
||||
return self.GetComponent<AOIEntity>().GetBeSeePlayers();
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bcdc9f9c96c0ff146ac609ff97b4903a
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,20 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
// 离开视野
|
||||
[Event(SceneType.Map)]
|
||||
public class UnitLeaveSightRange_NotifyClient: AEvent<Scene, EventType.UnitLeaveSightRange>
|
||||
{
|
||||
protected override async ETTask Run(Scene scene, EventType.UnitLeaveSightRange args)
|
||||
{
|
||||
await ETTask.CompletedTask;
|
||||
AOIEntity a = args.A;
|
||||
AOIEntity b = args.B;
|
||||
if (a.Unit.Type != UnitType.Player)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
MessageHelper.NoticeUnitRemove(a.GetParent<Unit>(), b.GetParent<Unit>());
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 10a2365c686050546995d6a3897b9038
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,49 @@
|
||||
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
public static partial class MessageHelper
|
||||
{
|
||||
public static void NoticeUnitAdd(Unit unit, Unit sendUnit)
|
||||
{
|
||||
M2C_CreateUnits createUnits = M2C_CreateUnits.Create();
|
||||
createUnits.Units.Add(UnitHelper.CreateUnitInfo(sendUnit));
|
||||
MessageHelper.SendToClient(unit, createUnits);
|
||||
}
|
||||
|
||||
public static void NoticeUnitRemove(Unit unit, Unit sendUnit)
|
||||
{
|
||||
M2C_RemoveUnits removeUnits = M2C_RemoveUnits.Create();
|
||||
removeUnits.Units.Add(sendUnit.Id);
|
||||
MessageHelper.SendToClient(unit, removeUnits);
|
||||
}
|
||||
|
||||
public static void Broadcast(Unit unit, IActorMessage message)
|
||||
{
|
||||
(message as MessageObject).IsFromPool = false;
|
||||
Dictionary<long, AOIEntity> dict = unit.GetBeSeePlayers();
|
||||
// 网络底层做了优化,同一个消息不会多次序列化
|
||||
ActorLocationSenderOneType oneTypeLocationType = unit.Root().GetComponent<ActorLocationSenderComponent>().Get(LocationType.GateSession);
|
||||
foreach (AOIEntity u in dict.Values)
|
||||
{
|
||||
oneTypeLocationType.Send(u.Unit.Id, message);
|
||||
}
|
||||
}
|
||||
|
||||
public static void SendToClient(Unit unit, IActorMessage message)
|
||||
{
|
||||
unit.Root().GetComponent<ActorLocationSenderComponent>().Get(LocationType.GateSession).Send(unit.Id, message);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送协议给Actor
|
||||
/// </summary>
|
||||
public static void SendActor(Scene root, ActorId actorId, IActorMessage message)
|
||||
{
|
||||
root.GetComponent<ActorSenderComponent>().Send(actorId, message);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f741e13c630658444812d605a1de756f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Realm.meta
Normal file
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Realm.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 80190480a51b8114fb16950142846bd7
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using System.Net;
|
||||
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[MessageHandler(SceneType.Realm)]
|
||||
public class C2R_LoginHandler : MessageHandler<C2R_Login, R2C_Login>
|
||||
{
|
||||
protected override async ETTask Run(Session session, C2R_Login request, R2C_Login response)
|
||||
{
|
||||
// 随机分配一个Gate
|
||||
StartSceneConfig config = RealmGateAddressHelper.GetGate(session.Zone(), request.Account);
|
||||
Log.Debug($"gate address: {config}");
|
||||
|
||||
// 向gate请求一个key,客户端可以拿着这个key连接gate
|
||||
G2R_GetLoginKey g2RGetLoginKey = (G2R_GetLoginKey) await session.Fiber().Root.GetComponent<ActorSenderComponent>().Call(
|
||||
config.ActorId, new R2G_GetLoginKey() {Account = request.Account});
|
||||
|
||||
response.Address = config.InnerIPPort.ToString();
|
||||
response.Key = g2RGetLoginKey.Key;
|
||||
response.GateId = g2RGetLoginKey.GateId;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e499cce63c705be489700108cfb56ef2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,22 @@
|
||||
using System.Net;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[Invoke((long)SceneType.Realm)]
|
||||
public class FiberInit_Realm: AInvokeHandler<FiberInit, ETTask>
|
||||
{
|
||||
public override async ETTask Handle(FiberInit fiberInit)
|
||||
{
|
||||
Scene root = fiberInit.Fiber.Root;
|
||||
root.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
|
||||
root.AddComponent<TimerComponent>();
|
||||
root.AddComponent<CoroutineLockComponent>();
|
||||
root.AddComponent<ActorInnerComponent>();
|
||||
root.AddComponent<ActorSenderComponent>();
|
||||
StartSceneConfig startSceneConfig = StartSceneConfigCategory.Instance.Get(root.Fiber.Id);
|
||||
root.AddComponent<NetServerComponent, IPEndPoint>(startSceneConfig.InnerIPPort);
|
||||
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 1f15a025727328543b751e037d5c8657
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,17 @@
|
||||
using System.Collections.Generic;
|
||||
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
public static partial class RealmGateAddressHelper
|
||||
{
|
||||
public static StartSceneConfig GetGate(int zone, string account)
|
||||
{
|
||||
long hash = account.GetLongHashCode();
|
||||
|
||||
List<StartSceneConfig> zoneGates = StartSceneConfigCategory.Instance.Gates[zone];
|
||||
|
||||
return zoneGates[(int)(hash % zoneGates.Count)];
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: cb7be8a992c4c8e4f9c54c0543834360
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Robot.meta
Normal file
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Robot.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ec1d8ad3c64cebd42950e0400567e918
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 09a50e10da1069b4ca4863e50eb997fa
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3df587745c6211c459cafc9574d2efb0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,29 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using CommandLine;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ConsoleHandler(ConsoleMode.CreateRobot)]
|
||||
public class CreateRobotConsoleHandler: IConsoleHandler
|
||||
{
|
||||
public async ETTask Run(Fiber fiber, ModeContex contex, string content)
|
||||
{
|
||||
switch (content)
|
||||
{
|
||||
case ConsoleMode.CreateRobot:
|
||||
Log.Console("CreateRobot args error!");
|
||||
break;
|
||||
default:
|
||||
CreateRobotArgs options = null;
|
||||
Parser.Default.ParseArguments<CreateRobotArgs>(content.Split(' '))
|
||||
.WithNotParsed(error => throw new Exception($"CreateRobotArgs error!"))
|
||||
.WithParsed(o => { options = o; });
|
||||
|
||||
break;
|
||||
}
|
||||
contex.Parent.RemoveComponent<ModeContex>();
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5933b5c48d0a66e4e92904734aa09739
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,62 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[ConsoleHandler(ConsoleMode.Robot)]
|
||||
public class RobotConsoleHandler: IConsoleHandler
|
||||
{
|
||||
public async ETTask Run(Fiber fiber, ModeContex contex, string content)
|
||||
{
|
||||
string[] ss = content.Split(" ");
|
||||
switch (ss[0])
|
||||
{
|
||||
case ConsoleMode.Robot:
|
||||
break;
|
||||
|
||||
case "Run":
|
||||
{
|
||||
int caseType = int.Parse(ss[1]);
|
||||
|
||||
try
|
||||
{
|
||||
RobotLog.Debug($"run case start: {caseType}");
|
||||
await EventSystem.Instance.Invoke<RobotInvokeArgs, ETTask>(caseType, new RobotInvokeArgs() { Fiber = fiber, Content = content });
|
||||
RobotLog.Debug($"run case finish: {caseType}");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
RobotLog.Debug($"run case error: {caseType}\n{e}");
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "RunAll":
|
||||
{
|
||||
FieldInfo[] fieldInfos = typeof (RobotCaseType).GetFields();
|
||||
foreach (FieldInfo fieldInfo in fieldInfos)
|
||||
{
|
||||
int caseType = (int)fieldInfo.GetValue(null);
|
||||
if (caseType > RobotCaseType.MaxCaseType)
|
||||
{
|
||||
RobotLog.Debug($"case > {RobotCaseType.MaxCaseType}: {caseType}");
|
||||
break;
|
||||
}
|
||||
try
|
||||
{
|
||||
RobotLog.Debug($"run case start: {caseType}");
|
||||
await EventSystem.Instance.Invoke<RobotInvokeArgs, ETTask>(caseType, new RobotInvokeArgs() { Fiber = fiber, Content = content});
|
||||
RobotLog.Debug($"---------run case finish: {caseType}");
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
RobotLog.Debug($"run case error: {caseType}\n{e}");
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 578bb55fc361d0f4cabd05482892932d
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 085b02b7394eec94ba27bf98e11b44b6
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,35 @@
|
||||
namespace ET.Server
|
||||
{
|
||||
public static partial class RobotSceneFactory
|
||||
{
|
||||
public static async ETTask<Scene> Create(
|
||||
Entity parent,
|
||||
long id,
|
||||
long instanceId,
|
||||
int zone,
|
||||
string name,
|
||||
SceneType sceneType,
|
||||
StartSceneConfig startSceneConfig = null
|
||||
)
|
||||
{
|
||||
/*
|
||||
await ETTask.CompletedTask;
|
||||
Log.Info($"create scene: {sceneType} {name} {zone}");
|
||||
Scene scene = EntitySceneFactory.CreateScene(id, instanceId, zone, sceneType, name, parent);
|
||||
|
||||
scene.AddComponent<MailBoxComponent, MailBoxType>(MailBoxType.UnOrderedMessage);
|
||||
|
||||
switch (scene.SceneType)
|
||||
{
|
||||
case SceneType.Robot:
|
||||
scene.AddComponent<RobotManagerComponent>();
|
||||
break;
|
||||
}
|
||||
|
||||
return scene;
|
||||
*/
|
||||
await ETTask.CompletedTask;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8fc5dfc338ad5a34298bedfecf3e902f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Router.meta
Normal file
8
Assets/GameScripts/DotNet/Hotfix/Server/Demo/Router.meta
Normal file
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3475a99ac00ec6a40ac4b9bb6b84ab8c
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Text;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[HttpHandler(SceneType.RouterManager, "/get_router")]
|
||||
public class HttpGetRouterHandler : IHttpHandler
|
||||
{
|
||||
public async ETTask Handle(Scene scene, HttpListenerContext context)
|
||||
{
|
||||
HttpGetRouterResponse response = new();
|
||||
foreach (StartSceneConfig startSceneConfig in StartSceneConfigCategory.Instance.Realms)
|
||||
{
|
||||
response.Realms.Add(startSceneConfig.InnerIPPort.ToString());
|
||||
}
|
||||
foreach (StartSceneConfig startSceneConfig in StartSceneConfigCategory.Instance.Routers)
|
||||
{
|
||||
response.Routers.Add($"{startSceneConfig.StartProcessConfig.OuterIP}:{startSceneConfig.Port}");
|
||||
}
|
||||
HttpHelper.Response(context, response);
|
||||
await ETTask.CompletedTask;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 112dbe2a31f72854190a5ac197d5e1fe
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5ca381a4c6ce9b64ebd6f0497f8ebdee
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,26 @@
|
||||
using System.Collections;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
[EntitySystemOf(typeof(WatcherComponent))]
|
||||
[FriendOf(typeof(WatcherComponent))]
|
||||
public static partial class WatcherComponentSystem
|
||||
{
|
||||
[EntitySystem]
|
||||
public static void Awake(this WatcherComponent self)
|
||||
{
|
||||
string[] localIP = NetworkHelper.GetAddressIPs();
|
||||
var processConfigs = StartProcessConfigCategory.Instance.GetAll();
|
||||
foreach (StartProcessConfig startProcessConfig in processConfigs.Values)
|
||||
{
|
||||
if (!WatcherHelper.IsThisMachine(startProcessConfig.InnerIP, localIP))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
System.Diagnostics.Process process = WatcherHelper.StartProcess(startProcessConfig.Id);
|
||||
self.Processes.Add(startProcessConfig.Id, process);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 74b099ff0f3523d47af0595ae8bf6b3f
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@@ -0,0 +1,56 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Diagnostics;
|
||||
|
||||
namespace ET.Server
|
||||
{
|
||||
public static partial class WatcherHelper
|
||||
{
|
||||
public static StartMachineConfig GetThisMachineConfig()
|
||||
{
|
||||
string[] localIP = NetworkHelper.GetAddressIPs();
|
||||
StartMachineConfig startMachineConfig = null;
|
||||
foreach (StartMachineConfig config in StartMachineConfigCategory.Instance.GetAll().Values)
|
||||
{
|
||||
if (!WatcherHelper.IsThisMachine(config.InnerIP, localIP))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
startMachineConfig = config;
|
||||
break;
|
||||
}
|
||||
|
||||
if (startMachineConfig == null)
|
||||
{
|
||||
throw new Exception("not found this machine ip config!");
|
||||
}
|
||||
|
||||
return startMachineConfig;
|
||||
}
|
||||
|
||||
public static bool IsThisMachine(string ip, string[] localIPs)
|
||||
{
|
||||
if (ip != "127.0.0.1" && ip != "0.0.0.0" && !((IList) localIPs).Contains(ip))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static System.Diagnostics.Process StartProcess(int processId, int createScenes = 0)
|
||||
{
|
||||
StartProcessConfig startProcessConfig = StartProcessConfigCategory.Instance.Get(processId);
|
||||
const string exe = "dotnet";
|
||||
string arguments = $"App.dll" +
|
||||
$" --Process={startProcessConfig.Id}" +
|
||||
$" --AppType=Server" +
|
||||
$" --StartConfig={Options.Instance.StartConfig}" +
|
||||
$" --Develop={Options.Instance.Develop}" +
|
||||
$" --LogLevel={Options.Instance.LogLevel}" +
|
||||
$" --Console={Options.Instance.Console}";
|
||||
Log.Debug($"{exe} {arguments}");
|
||||
System.Diagnostics.Process process = ProcessHelper.Run(exe, arguments);
|
||||
return process;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 95a7ba0a15340d143a8eb9787899fcc6
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
Reference in New Issue
Block a user