Files
hjha-server/GameModule/Shadow/ShadowPool.cs
xiaoou e9616125ce feat: initial commit - HJHA game server full source
6 major server modules (PdkFriendServer/GlobalSever/ServerCore/GameModule/GameNetModule) +
game logic (GameFix/GameDAL/ServerData) +
network layer (NetWorkMessage) +
data layer (ObjectModel) +
utilities (MrWu/Core/Config/CloudAPI/dll) +
adapters (zyxAdapter/base)

.NET 8.0 C# solution, 16 projects, 958 source files
2026-07-07 12:02:15 +08:00

262 lines
7.9 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using Server.Data;
using System.Collections.Generic;
using MrWu.Debug;
using System.IO;
using System.Text;
using MrWu.Basic;
using Server;
namespace Game.Shadow
{
/// <summary>
/// 影子池
/// </summary>
public class ShadowPool
{
/// <summary>
/// 初始化
/// </summary>
public void Init()
{
ShadowManager.instance.LoadShadows();
}
/// <summary>
/// 随机获取一个名字
/// </summary>
/// <returns></returns>
public Shadow GetRandomShadow()
{
return ShadowManager.instance.GetRandomName();
}
/// <summary>
/// 放入影子
/// </summary>
/// <param name="shadow"></param>
public void PutShadows(Shadow shadow)
{
ShadowManager.instance.PutShadows(shadow);
}
/// <summary>
/// 放入影子
/// </summary>
/// <param name="sds"></param>
public void PutShadows(IEnumerable<Shadow> sds)
{
ShadowManager.instance.PutShadows(sds);
}
/// <summary>
/// 当玩家上桌的时候 使用
/// </summary>
public virtual bool SetPlayerShadow(PlayerDataAsyc pl, int roomid, int roomCnt, RoomManager[] rooms)
{
Shadow[] shadows = null;
PlayerDataAsyc[] sds = null;
if (pl.shadowsInfo == null)
{
//没影子就去取影子
shadows = ShadowManager.instance.GetShadows(roomCnt);
sds = new PlayerDataAsyc[roomCnt];
}
else
{
shadows = pl.shadowsInfo;
sds = pl.shadows;
}
//取新的
if (shadows == null)
{
Debug.Error("未获取到影子!!!!");
return false;
}
int maxMoney = 0;
bool isNew = false;
//为影子创建玩家
for (int i = 0; i < roomCnt; i++)
{
isNew = false; //重置状态
if (sds[i] != null &&
(sds[i].money < rooms[i].config.MinMoney || sds[i].money >= rooms[i].config.MaxMoney))
{
//影子的钱不在此房间范围,换影子
ShadowManager.instance.PutShadows(shadows[i]);
sds[i] = null;
var tmp = ShadowManager.instance.GetShadows(1);
if (tmp == null)
{
Debug.Error("第二次取。。。。未取到影子?????");
return false;
}
shadows[i] = tmp[0];
}
if (sds[i] == null)
{
//影子没人
sds[i] = new PlayerDataAsyc();
sds[i].nickname = shadows[i].name;
sds[i].sex = shadows[i].sex;
sds[i].avatar = shadows[i].photo;
sds[i].area = "江西南昌";
isNew = true;
}
if (isNew)
{
//新的影子, 重新设置金额
maxMoney = rooms[i].config.MaxMoney;
if (maxMoney > 1000000000) //最大值大于10亿 应该是最后一个房间
{
if (rooms[i].config.MinMoney < 200000000) //如果房间的最小金额小于2亿
maxMoney = 200000000; //让鬼的金额不至于太大
}
//矫正金额
sds[i].money = BaseFun.random.Next(rooms[i].config.MinMoney, maxMoney);
}
}
pl.shadows = sds;
pl.shadowsInfo = shadows;
return true;
}
/// <summary>
/// 影子管理
/// </summary>
protected class ShadowManager
{
/// <summary>
/// 实例
/// </summary>
public static ShadowManager instance { get; private set; }
private ShadowManager()
{
}
static ShadowManager()
{
instance = new ShadowManager();
}
/// <summary>
/// 所有的影子
/// </summary>
protected readonly List<Shadow> shadows = new List<Shadow>();
/// <summary>
/// 影子剩余数量
/// </summary>
public int count
{
get { return shadows.Count; }
}
/// <summary>
/// 加载影子
/// </summary>
public void LoadShadows()
{
string[] lines = File.ReadAllLines(TableManager.GetRobotInfoPath(), Encoding.UTF8);
int len = lines.Length;
//没开金币场
if (ServerConfigManager.Instance.OpenGold == 0)
{
len = Math.Min(len, 10);
}
Debug.Info($"读取到替身名字{len}个");
for (int i = 0; i < len; i++)
{
string[] items = lines[i].Split(',');
string phtoto = null;
if (items.Length > 1)
{
phtoto = $"https://cs1.jxhappy.top/GameRes/Avatar/{items[1]}";
}
Shadow shadow = new Shadow(items[0], phtoto, i % 2);
shadows.Add(shadow);
}
}
static int namecnt;
/// <summary>
/// 随机一个影子的名字
/// </summary>
/// <returns></returns>
public Shadow GetRandomName()
{
int cnt = 10;
for (int i = 0; i < cnt; i++)
{
int idx = BaseFun.random.Next(0, count);
var sd = shadows[idx];
if (!sd.isGetName) //名字没被使用过
{
sd.isGetName = true;
return sd;
}
}
return null;
}
/// <summary>
/// 获取影子
/// </summary>
/// <param name="count"></param>
/// <returns></returns>
public Shadow[] GetShadows(int count)
{
Debug.Log("影子的数量:" + shadows.Count + "," + count);
if (shadows.Count < count)
return null;
Shadow[] sds = new Shadow[count];
for (int i = 0; i < count; i++)
{
int idx = BaseFun.random.Next(0, shadows.Count);
sds[i] = shadows[idx];
shadows.RemoveAt(idx);
}
// Debug.Log("剩余的替身数量:" + shadows.Count);
return sds;
}
/// <summary>
/// 放入影子
/// </summary>
/// <param name="sds"></param>
public void PutShadows(IEnumerable<Shadow> sds)
{
shadows.AddRange(sds);
}
/// <summary>
/// 放入影子
/// </summary>
/// <param name="shadow"></param>
public void PutShadows(Shadow shadow)
{
shadows.Add(shadow);
}
}
}
}