mirror of
https://gitee.com/jisol/jisol-game/
synced 2025-09-27 10:46:17 +00:00
提交
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
using JNGame.Math;
|
||||
using JNGame.Sync.Frame.Service;
|
||||
using JNGame.Sync.State.Tile;
|
||||
using JNGame.Sync.System;
|
||||
|
||||
namespace Game.Logic.System
|
||||
{
|
||||
public class DGBasisSystem : SLogicSystem
|
||||
{
|
||||
|
||||
public JNRandomSystem Random => GetSystem<JNRandomSystem>();
|
||||
|
||||
//判断是否是Tile模式
|
||||
public bool IsTile()
|
||||
{
|
||||
return Sync is JNSSTileServerService;
|
||||
}
|
||||
|
||||
//获取当前权限瓦块随机点
|
||||
public LVector3 GetTileRandom()
|
||||
{
|
||||
if (Sync is JNSSTileServerService tileServer)
|
||||
{
|
||||
return new LVector3(
|
||||
Random.Float(tileServer.MinContains.x,tileServer.MaxContains.x),
|
||||
LFloat.Zero,
|
||||
Random.Float(tileServer.MinContains.y,tileServer.MaxContains.y)
|
||||
);
|
||||
}
|
||||
return LVector3.Down;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// [状态同步生命周期] 玩家离开服务器 不在游戏线程中执行
|
||||
/// </summary>
|
||||
public virtual void OnPlayerExitServer(int auth){}
|
||||
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c42fd1121fb849b38dc7f94db9c3f3df
|
||||
timeCreated: 1722861514
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: babf7d8ac075441b803a0078da31ce8a
|
||||
timeCreated: 1724724193
|
@@ -0,0 +1,41 @@
|
||||
using DotRecast.Core.Collections;
|
||||
using Game.Input;
|
||||
using Game.JNGFrame.Logic.Entity;
|
||||
using Game.JNGFrame.Logic.Entity.Contexts;
|
||||
using Game.Logic.Entity.Nodes;
|
||||
using JNGame.Math;
|
||||
|
||||
namespace Game.Logic.System.Logic
|
||||
{
|
||||
/// <summary>
|
||||
/// Boss逻辑
|
||||
/// </summary>
|
||||
public class DBossSystem : DGBasisSystem
|
||||
{
|
||||
|
||||
//Node 节点
|
||||
public EDBoss[] Nodes => NodeContext.GetHostEntities();
|
||||
public EDBossContext NodeContext => Contexts.GetContext<EDBossContext>();
|
||||
|
||||
public DInputSystem Input => GetSystem<DInputSystem>();
|
||||
|
||||
public override void OnSyncUpdate(int dt)
|
||||
{
|
||||
base.OnSyncUpdate(dt);
|
||||
|
||||
//创建Boss
|
||||
GetSystem<DInputSystem>().SInput<IDWorld>().ForEach(child =>
|
||||
{
|
||||
|
||||
var idWorld = (IDWorld)child.Value;
|
||||
if (idWorld is { IsBossCreate: true })
|
||||
{
|
||||
var entity = NodeContext.CreateEntity();
|
||||
entity.Move.SetPosition(GetTileRandom());
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b48944cb153b4e67809d2cddde1acc6b
|
||||
timeCreated: 1724724224
|
@@ -0,0 +1,58 @@
|
||||
using DotRecast.Core.Collections;
|
||||
using Game.Input;
|
||||
using Game.JNGFrame.Logic.Entity.Contexts;
|
||||
using Game.Logic.Entity.Nodes;
|
||||
using JNGame.Math;
|
||||
|
||||
namespace Game.Logic.System.Logic
|
||||
{
|
||||
/// <summary>
|
||||
/// 玩家逻辑
|
||||
/// </summary>
|
||||
public class DPlayerSystem : DGBasisSystem
|
||||
{
|
||||
|
||||
//Node 节点
|
||||
public EDPlayer[] Nodes => NodeContext.GetHostEntities();
|
||||
public EDPlayerContext NodeContext => Contexts.GetContext<EDPlayerContext>();
|
||||
|
||||
public DInputSystem Input => GetSystem<DInputSystem>();
|
||||
|
||||
public override void OnSyncUpdate(int dt)
|
||||
{
|
||||
base.OnSyncUpdate(dt);
|
||||
|
||||
//创建角色
|
||||
GetSystem<DInputSystem>().SInput<IDWorld>().ForEach(child =>
|
||||
{
|
||||
var key = child.Key;
|
||||
var idWorld = (IDWorld)child.Value;
|
||||
|
||||
if (idWorld is { IsPlayerCreate: true })
|
||||
{
|
||||
var entity = NodeContext.CreateEntity();
|
||||
entity.Controller.AuthBind(key);
|
||||
var spawn = new LVector3(Random.Float(0, 0),Random.Float(0, 0),Random.Float(0, 0));
|
||||
entity.Move.SetPosition(spawn);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
|
||||
public override void OnPlayerExitServer(int auth)
|
||||
{
|
||||
base.OnPlayerExitServer(auth);
|
||||
|
||||
NodeContext.GetHostEntities().ForEach(child =>
|
||||
{
|
||||
if (child.Controller.Auth == auth)
|
||||
{
|
||||
child.DelayDestroy();
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 7b59673517e1408295737003f44b2690
|
||||
timeCreated: 1722224946
|
@@ -0,0 +1,56 @@
|
||||
using System.Collections.Generic;
|
||||
using Game.Input;
|
||||
using Game.JNGFrame.Logic.Entity;
|
||||
using Game.JNGFrame.Logic.Entity.Contexts;
|
||||
using Game.Logic.Entity.Nodes;
|
||||
using JNGame.Math;
|
||||
|
||||
namespace Game.Logic.System.Logic
|
||||
{
|
||||
public class DWorldSystem : DGBasisSystem
|
||||
{
|
||||
|
||||
//Node 节点
|
||||
public EDNode[] Nodes => NodeContext.GetHostEntities();
|
||||
public EDNodeContext NodeContext => Contexts.GetContext<EDNodeContext>();
|
||||
|
||||
//Node 第一个节点
|
||||
public Queue<EDNode> NodeQueue = new();
|
||||
|
||||
public override void OnSyncUpdate(int dt)
|
||||
{
|
||||
|
||||
base.OnSyncUpdate(dt);
|
||||
if (GetSystem<DInputSystem>().SInputOne<IDWorld>() is not IDWorld { IsAdd: true }) return;
|
||||
|
||||
//超过500 则 销毁第一个实体
|
||||
if (Nodes.Length >= 100)
|
||||
{
|
||||
NodeQueue.Dequeue().Destroy();
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
var max = 100;
|
||||
EDNode entity;
|
||||
if (IsTile())
|
||||
{
|
||||
entity = Contexts.GetContext<EDNodeContext>().CreateEntity();
|
||||
entity.Move.SetPosition(GetTileRandom());
|
||||
entity.Move.Go(GetTileRandom());
|
||||
}
|
||||
else
|
||||
{
|
||||
entity = Contexts.GetContext<EDNodeContext>().CreateEntity();
|
||||
var spawn = new LVector3(Random.Float(0, max),Random.Float(0, 100),Random.Float(0, max));
|
||||
entity.Move.SetPosition(spawn);
|
||||
spawn = new LVector3(Random.Float(0, max),Random.Float(0, 100),Random.Float(0, max));
|
||||
entity.Move.Go(spawn);
|
||||
}
|
||||
|
||||
NodeQueue.Enqueue(entity);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 00e91648e3cd42a8ae1399000b88fdd6
|
||||
timeCreated: 1712720318
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9c7f6594b809471b929e958068a70d32
|
||||
timeCreated: 1724724127
|
@@ -0,0 +1,23 @@
|
||||
using AppGame;
|
||||
using JNGame.Map;
|
||||
using JNGame.Map.DotRecast.Util;
|
||||
|
||||
namespace Game.Logic.System.Usual
|
||||
{
|
||||
/// <summary>
|
||||
/// 游戏数据
|
||||
/// </summary>
|
||||
public class DDataSystem : DGBasisSystem
|
||||
{
|
||||
|
||||
public StaticMapData MapData;
|
||||
public MeshData MapData2;
|
||||
|
||||
public override void OnSyncStart()
|
||||
{
|
||||
base.OnSyncStart();
|
||||
MapData = App.Resource.MapData;
|
||||
MapData2 = App.Resource.MapData2;
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5c9d6660f75144ce84276d8536a9ffc2
|
||||
timeCreated: 1715158899
|
@@ -0,0 +1,105 @@
|
||||
using System.Collections.Generic;
|
||||
using DotRecast.Core.Numerics;
|
||||
using DotRecast.Detour;
|
||||
using DotRecast.Detour.Crowd;
|
||||
using JNGame.Map.DotRecast;
|
||||
using JNGame.Math;
|
||||
using UnityEngine;
|
||||
|
||||
namespace Game.Logic.System.Usual
|
||||
{
|
||||
/// <summary>
|
||||
/// 地图
|
||||
/// </summary>
|
||||
public class DMapSystem : DGBasisSystem
|
||||
{
|
||||
|
||||
public DotRecastRoot Root;
|
||||
|
||||
public override void OnSyncStart()
|
||||
{
|
||||
base.OnSyncStart();
|
||||
Root = new DotRecastRoot(GetSystem<DDataSystem>().MapData2);
|
||||
Debug.Log($"DemoMapService - 加载完成地图");
|
||||
}
|
||||
|
||||
public override void OnSyncUpdate(int dt)
|
||||
{
|
||||
base.OnSyncUpdate(dt);
|
||||
Root.Update(new LFloat(null,Sync.DeltaTime));
|
||||
}
|
||||
|
||||
public DtCrowdAgentParams GetAgentParams()
|
||||
{
|
||||
int updateFlags = DtCrowdAgentUpdateFlags.DT_CROWD_ANTICIPATE_TURNS |
|
||||
DtCrowdAgentUpdateFlags.DT_CROWD_OPTIMIZE_VIS |
|
||||
DtCrowdAgentUpdateFlags.DT_CROWD_OPTIMIZE_TOPO |
|
||||
DtCrowdAgentUpdateFlags.DT_CROWD_OBSTACLE_AVOIDANCE;
|
||||
DtCrowdAgentParams ap = new DtCrowdAgentParams();
|
||||
ap.radius = (LFloat)0.6f;
|
||||
ap.height = (LFloat)2f;
|
||||
ap.maxAcceleration = (LFloat)8.0f;
|
||||
ap.maxSpeed = (LFloat)6f;
|
||||
ap.collisionQueryRange = ap.radius * (LFloat)12f;
|
||||
ap.pathOptimizationRange = ap.radius * (LFloat)30f;
|
||||
ap.updateFlags = updateFlags;
|
||||
ap.obstacleAvoidanceType = 0;
|
||||
ap.separationWeight = (LFloat)2f;
|
||||
return ap;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 返回最近点
|
||||
/// </summary>
|
||||
/// <param name="pos"></param>
|
||||
/// <returns></returns>
|
||||
public LVector3 GetNearbyPoints(LVector3 pos)
|
||||
{
|
||||
return Root.GetNearbyPoints(pos);
|
||||
}
|
||||
/// <summary>
|
||||
/// 查询导航
|
||||
/// </summary>
|
||||
/// <param name="pos"></param>
|
||||
/// <returns></returns>
|
||||
public List<DtStraightPath> FindPath(LVector3 start,LVector3 end)
|
||||
{
|
||||
return Root.FindPath(start,end);
|
||||
}
|
||||
|
||||
//添加避障
|
||||
public void AddAgent(ulong id,LVector3 start)
|
||||
{
|
||||
Root.AddAgent(id,new RcVec3f(start.x,start.y,start.z));
|
||||
}
|
||||
public void AddAgent(ulong id,LVector3 start,DtCrowdAgentParams agentParams)
|
||||
{
|
||||
Root.AddAgent(id,new RcVec3f(start.x,start.y,start.z),agentParams);
|
||||
}
|
||||
|
||||
//删除避障
|
||||
public void DelAgent(ulong id)
|
||||
{
|
||||
Root.DelAgent(id);
|
||||
}
|
||||
|
||||
//移动避障
|
||||
public void MoveAgent(ulong id,LVector3 move)
|
||||
{
|
||||
Root.MoveAgent(id,new RcVec3f(move.x,move.y,move.z));
|
||||
}
|
||||
|
||||
//向量移动避障
|
||||
public void VectorMoveAgent(ulong id,LVector2 vector)
|
||||
{
|
||||
Root.VectorMoveAgent(id,new RcVec3f(vector.x,0,vector.y));
|
||||
}
|
||||
|
||||
//获取避障
|
||||
public DtCrowdAgent GetAgent(ulong id)
|
||||
{
|
||||
return Root.GetAgent(id);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9f6e62838e334b6e983b238063cc2479
|
||||
timeCreated: 1715157690
|
Reference in New Issue
Block a user