feat(model): 新增地图配置、BOSS数据和怪物刷新模块

This commit is contained in:
1
2025-08-16 02:39:25 +00:00
parent d34ec2eed1
commit caa901d208
9 changed files with 389 additions and 2 deletions

123
common/data/xml/map/map.go Normal file
View File

@@ -0,0 +1,123 @@
package xml
import (
"fmt"
"io"
"log"
"net/http"
"time"
"github.com/ECUST-XX/xml"
)
// Maps 根节点,对应<Maps>标签
type Maps struct {
XMLName xml.Name `xml:"Maps"`
Maps []Map `xml:"map"` // 包含所有地图配置
}
// Map 单张地图配置,对应<map>标签
type Map struct {
ID int `xml:"id,attr"` // 地图ID
Name string `xml:"name,attr"` // 地图名称
X int `xml:"x,attr"` // 地图X坐标
Y int `xml:"y,attr"` // 地图Y坐标
Des string `xml:"des,attr,omitempty"` // 地图描述(可选)
Super int `xml:"super,attr,omitempty"` // 上级地图ID可选
IsFB int `xml:"isFB,attr,omitempty"` // 是否为副本0/1可选
IsLocal int `xml:"isLocal,attr,omitempty"` // 是否为本地地图0/1可选
Sound string `xml:"sound,attr,omitempty"` // 背景音乐(可选)
ReplaceMapID int `xml:"replaceMapId,attr,omitempty"` // 替换地图ID可选
FX int `xml:"fx,attr,omitempty"` // 道具地面X坐标可选
FY int `xml:"fy,attr,omitempty"` // 道具地面Y坐标可选
WX int `xml:"wx,attr,omitempty"` // 道具墙面X坐标可选
WY int `xml:"wy,attr,omitempty"` // 道具墙面Y坐标可选
HX int `xml:"hx,attr,omitempty"` // 总部主电脑X坐标可选
HY int `xml:"hy,attr,omitempty"` // 总部主电脑Y坐标可选
Entries Entries `xml:"Entries,omitempty"` // 进入点配置(可选)
ChangeMapComp ComponentList `xml:"changeMapComp,omitempty"` // 场景切换组件(可选)
FunComp ComponentList `xml:"funComp,omitempty"` // 点击触发组件(可选)
AutoComp ComponentList `xml:"autoComp,omitempty"` // 自动触发组件(可选)
}
// Entries 进入点集合,对应<Entries>标签
type Entries struct {
Entries []Entry `xml:"Entry"` // 多个进入点
}
// Entry 单个进入点配置,对应<Entry>标签
type Entry struct {
FromMap int `xml:"FromMap,attr"` // 来源地图ID
PosX int `xml:"PosX,attr"` // 进入后X坐标
PosY int `xml:"PosY,attr"` // 进入后Y坐标
}
// ComponentList 组件集合(用于统一管理不同类型的组件列表)
type ComponentList struct {
Components []Component `xml:"component"` // 多个组件
}
// Component 单个功能组件配置,对应<component>标签
type Component struct {
Name string `xml:"name,attr,omitempty"` // 组件名称(可选)
Hit string `xml:"hit,attr,omitempty"` // 碰撞区域标识(可选)
TargetID int `xml:"targetID,attr,omitempty"` // 目标地图ID可选
Dir int `xml:"dir,attr,omitempty"` // 滚动方向1-4可选
Fun string `xml:"fun,attr,omitempty"` // 触发函数名(可选)
Des string `xml:"des,attr,omitempty"` // 鼠标提示文本(可选)
IsStop int `xml:"isStop,attr,omitempty"` // 鼠标悬停是否跳帧0/1可选
}
// ReadHTTPFile 通过HTTP GET请求获取远程文件内容
// url: 远程文件的URL地址
// 返回文件内容字节流和可能的错误
func ReadHTTPFile(url string) ([]byte, error) {
// 创建HTTP客户端并设置超时时间避免无限等待
client := &http.Client{
Timeout: 30 * time.Second, // 30秒超时
}
// 发送GET请求
resp, err := client.Get(url)
if err != nil {
return nil, fmt.Errorf("请求失败: %w", err)
}
defer resp.Body.Close() // 确保响应体被关闭
// 检查响应状态码
if resp.StatusCode != http.StatusOK {
return nil, fmt.Errorf("请求返回非成功状态码: %d", resp.StatusCode)
}
// 读取响应体内容
content, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("读取内容失败: %w", err)
}
return content, nil
}
func getxml() ([]byte, error) {
// 读取整个文件内容,返回字节切片和错误
content, err := ReadHTTPFile("http://127.0.0.1:8080/assets/map_info.xml")
if err != nil {
// 处理错误(文件不存在、权限问题等)
log.Fatalf("无法读取文件: %v", err)
}
return content, nil
}
func getMaps() Maps {
// 解析XML到结构体
var maps Maps
t1, _ := getxml()
xml.Unmarshal(t1, &maps)
return maps
}
// 全局函数配置
var MapConfig = getMaps()

View File

@@ -0,0 +1,148 @@
package xml
import (
"fmt"
"strings"
"testing"
"github.com/ECUST-XX/xml"
"github.com/antchfx/xmlquery"
)
var s = `
<?xml version="1.0" encoding="UTF-8" ?>
<!--
多个地图ID归属于一个星球
此XML表主要配置一些各个星球有可能需要用到的共用信息, 比如目前在世界地图上显示玩家所在位置
-->
<superMaps>
<maps id="1" name="传送舱" x="" y=""/>
<maps id="4" name="船长室" x="" y=""/>
<maps id="5" name="实验室" x="" y=""/>
<maps id="6" name="动力室" x="" y=""/>
<maps id="7" name="瞭望舱" x="" y=""/>
<maps id="8" name="机械室" x="" y=""/>
<maps id="9" name="资料室" x="" y=""/>
<maps id="19" name="太空站" x="" y=""/>
<maps id="101" name="教官办公室" x="" y=""/>
<maps id="103" name="瞭望露台" x="" y=""/>
<maps id="107" name="发明室" x="" y=""/>
<!--星球-->
<maps id="10 11 12 13" name="克洛斯星" galaxy="1" x="358" y="46"/>
<maps id="15 16 17" name="火山星" galaxy="1" x="533" y="46"/>
<maps id="20 21 22" name="海洋星" galaxy="1" x="190" y="11"/>
<maps id="25 26 27" name="云霄星" galaxy="1" x="652" y="24"/>
<maps id="30 31 32 33 34 35 36" name="赫尔卡星" galaxy="1" x="45" y="34"/>
<maps id="40 41 42 43" name="塞西利亚星" galaxy="1" x="1012" y="30"/>
<maps id="17" name="双子阿尔法星" galaxy="1" x="822" y="96"/>
<maps id="47 49" name="双子贝塔星" galaxy="1" x="883" y="63"/>
<maps id="51 52 53" name="斯诺星" galaxy="1" x="1290" y="15"/>
<maps id="54 55 56" name="露西欧星" galaxy="1" x="1405" y="120"/>
<maps id="57 58 59" name="尼古尔星" galaxy="2" x="30" y="50"/>
<maps id="60 61 62 63 64" name="塔克星" galaxy="2" x="135" y="44"/>
<maps id="325 326 327" name="艾迪星" galaxy="2" x="250" y="30"/>
<maps id="328" name="斯科尔星" galaxy="2" x="375" y="40"/>
<maps id="333 334" name="普雷空间站" galaxy="2" x="500" y="50"/>
<maps id="338 339" name="哈默星" galaxy="2" x="590" y="70"/>
<maps id="314" name="拜伦号" galaxy="1" x="1160" y="55"/>
</superMaps>`
func Test_main(t *testing.T) {
// 解析XML到结构体
var maps Maps
t1, _ := getxml()
xml.Unmarshal(t1, &maps)
//tf, _ := xml.MarshalIndentShortForm(tt, " ", " ")
fmt.Println(maps)
}
func main1() {
s := `
<?xml version="1.0" encoding="UTF-8" ?>
<!--
多个地图ID归属于一个星球
此XML表主要配置一些各个星球有可能需要用到的共用信息, 比如目前在世界地图上显示玩家所在位置
-->
<superMaps>
<maps id="1" name="传送舱" x="" y=""/>
<maps id="4" name="船长室" x="" y=""/>
<maps id="5" name="实验室" x="" y=""/>
<maps id="6" name="动力室" x="" y=""/>
<maps id="7" name="瞭望舱" x="" y=""/>
<maps id="8" name="机械室" x="" y=""/>
<maps id="9" name="资料室" x="" y=""/>
<maps id="19" name="太空站" x="" y=""/>
<maps id="101" name="教官办公室" x="" y=""/>
<maps id="103" name="瞭望露台" x="" y=""/>
<maps id="107" name="发明室" x="" y=""/>
<!--星球-->
<maps id="10 11 12 13" name="克洛斯星" galaxy="1" x="358" y="46"/>
<maps id="15 16 17" name="火山星" galaxy="1" x="533" y="46"/>
<maps id="20 21 22" name="海洋星" galaxy="1" x="190" y="11"/>
<maps id="25 26 27" name="云霄星" galaxy="1" x="652" y="24"/>
<maps id="30 31 32 33 34 35 36" name="赫尔卡星" galaxy="1" x="45" y="34"/>
<maps id="40 41 42 43" name="塞西利亚星" galaxy="1" x="1012" y="30"/>
<maps id="17" name="双子阿尔法星" galaxy="1" x="822" y="96"/>
<maps id="47 49" name="双子贝塔星" galaxy="1" x="883" y="63"/>
<maps id="51 52 53" name="斯诺星" galaxy="1" x="1290" y="15"/>
<maps id="54 55 56" name="露西欧星" galaxy="1" x="1405" y="120"/>
<maps id="57 58 59" name="尼古尔星" galaxy="2" x="30" y="50"/>
<maps id="60 61 62 63 64" name="塔克星" galaxy="2" x="135" y="44"/>
<maps id="325 326 327" name="艾迪星" galaxy="2" x="250" y="30"/>
<maps id="328" name="斯科尔星" galaxy="2" x="375" y="40"/>
<maps id="333 334" name="普雷空间站" galaxy="2" x="500" y="50"/>
<maps id="338 339" name="哈默星" galaxy="2" x="590" y="70"/>
<maps id="314" name="拜伦号" galaxy="1" x="1160" y="55"/>
</superMaps>`
doc, err := xmlquery.Parse(strings.NewReader(s))
if err != nil {
panic(err)
}
//channel := xmlquery.FindOne(doc, "//superMaps")
// if n := channel.SelectElement("maps"); n != nil {
// fmt.Printf("title: %s\n", n.InnerText())
// }
if l := xmlquery.Find(doc, "//maps[@id='9']"); l != nil {
t := l[0].Attr
fmt.Printf("%v", t[1])
}
// for i, n := range xmlquery.Find(doc, "//maps/@id") {
// fmt.Printf("#%d %s\n", i, n.InnerText())
// }
}
func TestMMMs(t *testing.T) {
decoder := xml.NewDecoder(strings.NewReader(s))
var rootComments []string
rootFound := false
for {
token, err := decoder.Token()
if err != nil {
break
}
switch t := token.(type) {
case xml.StartElement:
// 遇到根元素开始标签后停止收集注释
rootFound = true
fmt.Printf("找到根元素: %s\n", t.Name.Local)
case xml.Comment:
if !rootFound {
// 保存根元素前的注释
rootComments = append(rootComments, string(t))
}
}
}
// 输出捕获的根注释
fmt.Println("\n根注释内容:")
for _, comment := range rootComments {
fmt.Println(strings.TrimSpace(comment))
}
}