Files
bl/common/data/xml/map/map.go

124 lines
4.5 KiB
Go
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.

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/210.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()