This commit is contained in:
2025-06-24 22:09:05 +08:00
parent 32a7a512a2
commit fdac99f11c
38 changed files with 42980 additions and 180 deletions

View File

@@ -1,41 +1,41 @@
module blazing/contrib/drivers/mysql
go 1.18
require (
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.6.3
github.com/gogf/gf/v2 v2.6.3
gorm.io/driver/mysql v1.5.4
gorm.io/gorm v1.25.7
)
require (
github.com/BurntSushi/toml v1.3.2 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
go.opentelemetry.io/otel v1.24.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/otel/sdk v1.24.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)
module blazing/contrib/drivers/mysql
go 1.18
require (
github.com/gogf/gf/contrib/drivers/mysql/v2 v2.6.3
github.com/gogf/gf/v2 v2.6.3
gorm.io/driver/mysql v1.5.4
gorm.io/gorm v1.25.7
)
require (
github.com/BurntSushi/toml v1.3.2 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/gorilla/websocket v1.5.1 // indirect
github.com/grokify/html-strip-tags-go v0.1.0 // indirect
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/kr/pretty v0.1.0 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
go.opentelemetry.io/otel v1.14.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
go.opentelemetry.io/otel/sdk v1.24.0 // indirect
go.opentelemetry.io/otel/trace v1.24.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

View File

@@ -2,16 +2,19 @@ package login
// CommendSvrInfo 初始连接请求信息结构体
type CommendSvrInfo struct {
MaxOnlineID uint32 // 最大连接数
IsVip uint32 // 建议为0
ServerList []ServerInfo // 服务器具体信息
Reversed uint32 // 保留字段
MaxOnlineID uint32 // 最大连接数
IsVip uint32 // 建议为0
ServerInfoLen uint32 `struc:"sizeof=ServerList"` // 服务器信息长度 ServerInfo
ServerList []ServerInfo // 服务器具体信息
Reversed uint32 // 保留字段
}
func NewCommendSvrInfo() *CommendSvrInfo {
return &CommendSvrInfo{
IsVip: 0,
ServerList: make([]ServerInfo, 0),
Reversed: 0,
MaxOnlineID: 100,
IsVip: 0,
ServerInfoLen: 0,
ServerList: make([]ServerInfo, 0),
Reversed: 0,
}
}

View File

@@ -0,0 +1,47 @@
package login
import (
"bytes"
"encoding/hex"
"fmt"
"testing"
"github.com/gogf/gf/v2/frame/g"
"github.com/lunixbochs/struc"
)
func TestNewCommendSvrInfo(t *testing.T) {
ret := NewCommendSvrInfo()
lofin := NewServerInfo()
lofin.OnlineID = 1
lofin.UserCnt = 77
lofin.IP = "127.0.0.1"
lofin.Port = 27777
lofin.Friends = 1
ret.ServerList = append(ret.ServerList, *lofin)
// bytt := bytearray.CreateByteArray()
// bytt.WriteUInt32(100)
// bytt.WriteUInt32(0)
// //ret.ServerList = append(ret.ServerList, *lofin)
var trr bytes.Buffer
// err := struc.Pack(&trr, lofin)
// bytt.WriteUInt32(1) //长度
// bytt.Write(trr.Bytes())
// bytt.WriteUInt32(1)
// //err:=Println(trr.Bytes())
/// 00 00 00 64 00 00 00 00 00 00 00 01 00 00 00 01 00 00 00 4d 31 32 37 2e 30 2e 30 2e 31 00 00 00 00 00 00 00 6c 81 00 00 00 01 00 00 00 00
err := struc.Pack(&trr, ret)
fmt.Println(err)
fmt.Println(trr.Bytes())
g.Dump(ret)
fmt.Println("000000640000000000000001000000010000004d3132372e302e302e31000000000000006c810000000100000000")
fmt.Println("000000640000000000000001000000010000004d3132372e302e302e31000000000000006c810000000100000000")
fmt.Println(hex.EncodeToString(trr.Bytes()))
}

View File

@@ -1,4 +1,58 @@
package entity
import (
"blazing/common/socket/cmd"
"blazing/common/socket/handler"
"bytes"
"github.com/lunixbochs/struc"
"github.com/panjf2000/gnet/v2"
)
type Player struct {
UserID uint32 //用户ID
Conn gnet.Conn
}
// PlayerOption 定义配置 Player 的函数类型
type PlayerOption func(*Player)
// WithUserID 设置用户ID的选项函数
func WithUserID(userID uint32) PlayerOption {
return func(p *Player) {
p.UserID = userID
}
}
func WithConn(Conn gnet.Conn) PlayerOption {
return func(p *Player) {
p.Conn = Conn
}
}
// NewPlayer 使用 Options 模式创建 Player 实例
func NewPlayer(opts ...PlayerOption) *Player {
p := &Player{}
for _, opt := range opts {
opt(p)
}
return p
}
func (p *Player) GetUserID() uint32 {
return p.UserID
}
func (p *Player) SendPackBytes(cmd cmd.EnumCommandID, data []byte) { //组包
head1 := handler.TomeeHeader{}
head1.CMDID = uint32(cmd)
head1.Len = uint32(len(data) + 17)
head1.Version = "7"
head1.UserID = p.UserID
head1.Result = 0
var data1 bytes.Buffer
struc.Pack(&data1, head1)
p.Conn.Write(data1.Bytes()) //写入头部
p.Conn.Write(data) //写入数据
}

View File

@@ -9,6 +9,12 @@ require (
github.com/gogf/gf/v2 v2.6.3
)
require (
github.com/antchfx/xmlquery v1.4.4 // indirect
github.com/antchfx/xpath v1.3.3 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
)
require (
github.com/BurntSushi/toml v1.2.0 // indirect
github.com/clbanning/mxj/v2 v2.7.0 // indirect
@@ -34,10 +40,10 @@ require (
go.opentelemetry.io/otel/trace v1.14.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.13.0 // indirect
golang.org/x/text v0.21.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
)

View File

@@ -1,6 +1,10 @@
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.2.0 h1:Rt8g24XnyGTyglgET/PRUNlrUeu9F5L+7FilkXfZgs0=
github.com/BurntSushi/toml v1.2.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/antchfx/xmlquery v1.4.4 h1:mxMEkdYP3pjKSftxss4nUHfjBhnMk4imGoR96FRY2dg=
github.com/antchfx/xmlquery v1.4.4/go.mod h1:AEPEEPYE9GnA2mj5Ur2L5Q5/2PycJ0N9Fusrx9b12fc=
github.com/antchfx/xpath v1.3.3 h1:tmuPQa1Uye0Ym1Zn65vxPgfltWb/Lxu2jeqIGteJSRs=
github.com/antchfx/xpath v1.3.3/go.mod h1:i54GszH55fYfBmoZXapTHN8T8tkcHfRgLyVwwqzXNcs=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/clbanning/mxj/v2 v2.7.0 h1:WA/La7UGCanFe5NpHF0Q3DNtnCsVoxbPKuyBNHWRyME=
github.com/clbanning/mxj/v2 v2.7.0/go.mod h1:hNiWqW14h+kc+MdF9C6/YoRfjEJoR3ou6tn/Qo+ve2s=
@@ -19,7 +23,10 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre
github.com/gogf/gf/contrib/nosql/redis/v2 v2.6.3/go.mod h1:2+evGu1xAlamaYuDdSqa7QCiwPTm1RrGsUFSMc8PyLc=
github.com/gogf/gf/v2 v2.6.3 h1:DoqeuwU98wotpFoDSQEx8RZbmJdK8KdGiJtzJeqpyIo=
github.com/gogf/gf/v2 v2.6.3/go.mod h1:x2XONYcI4hRQ/4gMNbWHmZrNzSEIg20s2NULbzom5k0=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
@@ -66,6 +73,7 @@ github.com/tnnmigga/enum v1.0.2/go.mod h1:QaBFBwGJi/2GAM34b2pz6UL2NRtl2TRZ8lXp4v
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.opentelemetry.io/otel v1.14.0 h1:/79Huy8wbf5DnIPhemGB+zEPVwnN6fuQybr/SRXa6hM=
go.opentelemetry.io/otel v1.14.0/go.mod h1:o4buv+dJzx8rohcUeRmWUZhqupFvzWis188WlggnNeU=
go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY=
@@ -85,16 +93,41 @@ go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM=
golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -102,20 +135,48 @@ golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211204120058-94396e421777/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk=
golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY=
golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

View File

@@ -97,6 +97,7 @@ func (f Fields) Pack(buf []byte, val reflect.Value, options *Options) (int, erro
return n, err
} else {
pos += n
//g.Dump(v)
}
}
return pos, nil

View File

@@ -2,6 +2,7 @@ package socket
import (
"context"
"log"
"blazing/common/data/entity"
@@ -48,7 +49,9 @@ func (s *Server) OnTraffic(conn gnet.Conn) (action gnet.Action) {
func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
for {
if !s.discorse {
handle(conn)
}
data, err := s.codec.Decode(conn)
if err != nil {
break
@@ -56,7 +59,7 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
//client := conn.RemoteAddr().String()
_ = s.workerPool.Submit(func() {
s.parser(data)
s.parser(conn, data)
})
return gnet.None
@@ -73,12 +76,44 @@ func (s *Server) handleTcp(conn gnet.Conn) (action gnet.Action) {
}
func (s *Server) parser(line []byte) {
func (s *Server) parser(c gnet.Conn, line []byte) {
//todo 这里待实现注入player实体
s.handler.Handle(line)
s.handler.Handle(c, line)
}
func (s *Server) Start() {
err := gnet.Run(s, s.network+"://"+s.addr, gnet.WithMulticore(s.multicore))
logging.Infof("server exits with error: %v", err)
}
// CROSS_DOMAIN 定义跨域策略文件内容
const CROSS_DOMAIN = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00"
// TEXT 定义跨域请求的文本格式
const TEXT = "<policy-file-request/>\x00"
func handle(c gnet.Conn) {
clientdata := c.Context().(*entity.ClientData)
if clientdata.IsCrossDomain {
return
}
// 读取数据并检查是否为跨域请求
data, err := c.Peek(len(TEXT))
if err != nil {
log.Printf("Error reading cross-domain request: %v", err)
return
}
if string(data) == TEXT { //判断是否是跨域请求
log.Printf("Received cross-domain request from %s", c.RemoteAddr())
// 处理跨域请求
c.Write([]byte(CROSS_DOMAIN))
c.Discard(len(TEXT))
clientdata.IsCrossDomain = true
return
}
//return
}

View File

@@ -18,6 +18,7 @@ type Server struct {
workerPool *goroutine.Pool
codec codec.SocketCodec
handler handler.Handler
discorse bool
}
type Option func(*Server)
@@ -31,6 +32,7 @@ func NewServer(options ...Option) *Server {
workerPool: goroutine.Default(),
bufferSize: 4096, //默认缓冲区大小
multicore: true,
discorse: true,
}
for _, option := range options {
option(server)
@@ -43,7 +45,11 @@ func WithSocketCodec(codec codec.SocketCodec) Option {
u.codec = codec
}
}
func WithCORS() Option {
return func(u *Server) {
u.discorse = false
}
}
func WithSocketHandler(handler handler.Handler) Option {
return func(u *Server) {
u.handler = handler

View File

@@ -1,21 +1,13 @@
package codec
import (
"blazing/common/data/entity"
"encoding/binary"
"errors"
"io"
"log"
"github.com/panjf2000/gnet/v2"
)
// CROSS_DOMAIN 定义跨域策略文件内容
const CROSS_DOMAIN = "<?xml version=\"1.0\"?><!DOCTYPE cross-domain-policy><cross-domain-policy><allow-access-from domain=\"*\" to-ports=\"*\" /></cross-domain-policy>\x00"
// TEXT 定义跨域请求的文本格式
const TEXT = "<policy-file-request/>\x00"
var ErrIncompletePacket = errors.New("incomplete packet")
// TomeeSocketCodec 协议格式:
@@ -39,31 +31,6 @@ func NewTomeeSocketCodec() *TomeeSocketCodec {
}
func handle(c gnet.Conn) {
clientdata := c.Context().(*entity.ClientData)
if clientdata.IsCrossDomain {
return
}
// 读取数据并检查是否为跨域请求
data, err := c.Peek(len(TEXT))
if err != nil {
log.Printf("Error reading cross-domain request: %v", err)
return
}
if string(data) == TEXT { //判断是否是跨域请求
log.Printf("Received cross-domain request from %s", c.RemoteAddr())
// 处理跨域请求
c.Write([]byte(CROSS_DOMAIN))
c.Discard(len(TEXT))
clientdata.IsCrossDomain = true
return
}
//return
}
func (codec TomeeSocketCodec) Encode(buf []byte) ([]byte, error) {
bodyLen := len(buf)
data := make([]byte, 4+bodyLen)
@@ -78,7 +45,7 @@ func (codec TomeeSocketCodec) Encode(buf []byte) ([]byte, error) {
func (codec TomeeSocketCodec) Decode(c gnet.Conn) ([]byte, error) {
handle(c)
// handle(c)
// 先读取4字节的包长度
lenBuf, err := c.Peek(4)
if err != nil {

View File

@@ -1,6 +1,8 @@
package handler
import "github.com/panjf2000/gnet/v2"
// Handler The handler receive every syslog entry at Handle method
type Handler interface {
Handle([]byte)
Handle(gnet.Conn, []byte)
}

View File

@@ -2,20 +2,23 @@ package handler
import (
"blazing/common/serialize/bytearray"
"github.com/panjf2000/gnet/v2"
)
// TomeeHeader 结构体字段定义
type TomeeHeader struct {
Len uint32 `json:"len"`
Version string `json:"version"`
UserID uint32 `json:"userId"`
Error uint32 `json:"error"`
CMDID uint32 `json:"cmdId"`
Result uint32 `json:"result"`
Data []byte `json:"data"`
UserID uint32 `json:"userId"`
//Error uint32 `json:"error" struc:"[0]pad"`
Result uint32 `json:"result"`
Data []byte `json:"data" struc:"[0]pad"` //组包忽略此字段
}
type TomeeHandler struct {
Callback func(data TomeeHeader)
Callback func(conn gnet.Conn, data TomeeHeader)
}
func NewTomeeHandler() *TomeeHandler {
@@ -23,7 +26,7 @@ func NewTomeeHandler() *TomeeHandler {
}
// Handle entry receiver
func (h *TomeeHandler) Handle(data []byte) { //处理接收到的数据 ,
func (h *TomeeHandler) Handle(c gnet.Conn, data []byte) { //处理接收到的数据 ,
//fmt.Println("接收数据", data)
header := TomeeHeader{}
@@ -37,6 +40,6 @@ func (h *TomeeHandler) Handle(data []byte) { //处理接收到的数据 ,
header.Result, _ = tempdata.ReadUInt32()
header.Data = tempdata.BytesAvailable()
//fmt.Println("接收封包", header)
h.Callback(header)
h.Callback(c, header)
//return header
}

View File

@@ -4,27 +4,19 @@ import (
"blazing/common/core/info"
"blazing/common/data/entity"
"blazing/logic/service/login"
"bytes"
"github.com/lunixbochs/struc"
"encoding/hex"
"fmt"
)
// todo 待实现自动编解码Recv_1001
// 处理命令: 1001
func (h Controller) Recv_1001(data []byte, player entity.Player) {
func (h Controller) Recv_1001(data []byte, player *entity.Player, res chan interface{}) {
pinfo := info.NewLoginSidInfo()
struc.Unpack(bytes.NewBuffer(data), &pinfo)
t := parseCmd[info.LoginSidInfo](pinfo, data)
//login.CheakSession(t, player)
// login.OnData_1001(pinfo, player)
fmt.Println(login.CheakSession(t, player))
//fmt.Println(pinfo)
login.OnData_1001(pinfo, player)
//fmt.Println(data)
}
func (h Controller) Recv_105(data []byte, player entity.Player) {
pinfo := info.NewLoginSidInfo()
struc.Unpack(bytes.NewBuffer(data), &pinfo)
//fmt.Println(pinfo)
login.OnData_105(pinfo, player)
//fmt.Println(data)
t1, _ := hex.DecodeString("0000045D37000003E9000186A600000000000186A6683F89CF6E69656F0000000000000000000000000008000F00000000000000000000000000000000000000000000000000000001000001DB0000018B000000000000A8C000000000000000000000000000000000000000080001388000000001000000017FFFFFFF00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF03030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000000000000000000000000000000000064000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000001FFFFFFFF000000004E4F4E4F0000000000000000000000000000000000000001000000010000000100000001000000010000000100000001000000000003030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030303030000000100000064000000000000000000000000000000000000001F000000000000006400000000000093F4000093F4000000D5000000F7000000AD00000088000000920000008C0000009C00000000000000000000000000000000000000000000000000000004000027900000001B00004E6200000014000028380000002800004E3E0000002368493DC60000000000000000000000000000000000000000000100000000000000A937000007D1000186A600000000000186A66E69656F00000000000000000000000000000000000000000000000F0000000000000000000001DB0000018B0000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF0000000000000001000000000000000000000000000000000000000000000000000000000000000000000000")
res <- t1
}

View File

@@ -1,9 +1,24 @@
package controller
//分发cmd逻辑实现Controller
import (
"bytes"
"github.com/lunixbochs/struc"
)
// 分发cmd逻辑实现Controller
type Controller struct {
}
func NewController() *Controller {
return &Controller{}
}
func parseCmd[T any](a T, data []byte) T {
// := info.NewLoginSidInfo()
struc.Unpack(bytes.NewBuffer(data), &a)
return a
//fmt.Println(pinfo)
//login.OnData_1001(pinfo, player)
//fmt.Println(data)
}

View File

@@ -1,5 +1,21 @@
module blazing/logic
go 1.19
require github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543
module blazing/logic
go 1.19
require github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543
require (
github.com/panjf2000/ants/v2 v2.11.3 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/sync v0.11.0 // indirect
golang.org/x/sys v0.30.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
)
require (
github.com/gogf/gf/v2 v2.6.3
github.com/panjf2000/gnet/v2 v2.9.1
gopkg.in/yaml.v3 v3.0.1 // indirect
)

View File

@@ -1,2 +1,23 @@
github.com/gogf/gf/v2 v2.9.0 h1:semN5Q5qGjDQEv4620VzxcJzJlSD07gmyJ9Sy9zfbHk=
github.com/gogf/gf/v2 v2.9.0/go.mod h1:sWGQw+pLILtuHmbOxoe0D+0DdaXxbleT57axOLH2vKI=
github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543 h1:GxMuVb9tJajC1QpbQwYNY1ZAo1EIE8I+UclBjOfjz/M=
github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg=
github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg=
github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek=
github.com/panjf2000/gnet/v2 v2.9.1 h1:bKewICy/0xnQ9PMzNaswpe/Ah14w1TrRk91LHTcbIlA=
github.com/panjf2000/gnet/v2 v2.9.1/go.mod h1:WQTxDWYuQ/hz3eccH0FN32IVuvZ19HewEWx0l62fx7E=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -1,6 +1,12 @@
package main
import (
"bytes"
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
"github.com/lunixbochs/struc"
"github.com/panjf2000/gnet/v2"
"blazing/common/core/info"
"blazing/common/data/entity"
"blazing/common/socket"
@@ -20,6 +26,7 @@ var (
maininfocodec = info.NewInfoCodec() //创建一个InfoCodec实例
maincontroller = controller.NewController() //注入service
mainplayer sync.Map //玩家数据
maincmdcache sync.Map //命令缓存
)
func main() {
@@ -34,72 +41,118 @@ func Start(port string) {
head.Callback = recv
socket.NewServer(socket.WithPort(port), socket.WithSocketHandler(head)).Start()
}
func recv(data handler.TomeeHeader) {
func recv(c gnet.Conn, data handler.TomeeHeader) {
// 处理接收到的TomeeHeader数据
// fmt.Println("收到数据:", data)
processWithReflection(data)
processWithReflection(c, data)
}
func getplayer(c gnet.Conn, userid uint32) *entity.Player { //TODO 这里待优化,可能存在内存泄漏问题
clientdata := c.Context().(*entity.ClientData)
if clientdata != nil && clientdata.Player != nil {
return clientdata.Player
}
var player *entity.Player
if player1, ok := mainplayer.Load((userid)); !ok {
player = entity.NewPlayer(
entity.WithUserID(userid), //注入ID
entity.WithConn(c), //注入conn
)
mainplayer.Store(userid, player)
} else {
player = player1.(*entity.Player) //取成功,否则创建
}
clientdata.Player = player
return player
}
// 遍历结构体方法并执行RECV_cmd
func processWithReflection(pp handler.TomeeHeader) {
// 获取对象的反射值和类型
value := reflect.ValueOf(maincontroller)
func processWithReflection(c gnet.Conn, pp handler.TomeeHeader) {
data := pp.Data
player := getplayer(c, pp.UserID) //获取player实例
cmdlister, ok := maincmdcache.Load(pp.CMDID) //TODO 待实现对不同用户初始化方法以取消全局cmdcache
// 如果传入的是指针,获取其指向的值
if value.Kind() == reflect.Ptr {
if value.IsNil() {
fmt.Println("错误: 传入的是nil指针")
return
}
value = value.Elem()
}
if ok {
// 获取类型
typ := value.Type()
callhandler(cmdlister.(reflect.Value), data, player, cmd.EnumCommandID(pp.CMDID))
// 遍历所有方法
fmt.Printf("检查结构体 %s 的方法...\n", typ.Name(), typ.NumMethod())
for i := 0; i < typ.NumMethod(); i++ {
method := typ.Method(i)
// return
} else {
// 获取对象的反射值和类型
value := reflect.ValueOf(maincontroller)
if method.Type.NumIn() == 3 { //&& // TODO 接收者 + 2个参数 一个是类型,一个是player
//method.Type.In(1) == reflect.TypeOf([]byte{}
// 获取方法值
methodValue := value.MethodByName(method.Name)
// 准备参数
cmd1 := method.Name[len("Recv_"):len(method.Name)]
cmdint, _ := strconv.Atoi(cmd1)
if cmdint == int(pp.CMDID) {
if !cmd.Isexist(cmd.CommandID, cmd.EnumCommandID(pp.CMDID)) {
fmt.Println("ID方法存在cmd未注册", pp.CMDID, cmd.CommandID)
}
// fmt.Println(" 找到匹配的RECV_cmd方法准备调用...", pp.Cmdid, Command.ID)
data := pp.Data
// trmp := getincodec(cmd.EnumCommandID(pp.CMDID), data)
//fmt.Println(trmp)
// serializer := serialize.NewFixedVarDeserializer(nil)
// tt1 := serializer.Deserialize(data, trmp)
// g.Dump(trmp)
// g.Dump(tt1)
// 调用方法
methodValue.Call([]reflect.Value{
// reflect.ValueOf(cmdint),
reflect.ValueOf(data),
reflect.ValueOf(entity.Player{}),
})
// 如果传入的是指针,获取其指向的值
if value.Kind() == reflect.Ptr {
if value.IsNil() {
fmt.Println("错误: 传入的是nil指针")
return
}
//return
value = value.Elem()
}
//}
// 获取类型
typ := value.Type()
// 遍历所有方法
fmt.Printf("检查结构体 %s 的方法...\n", typ.Name(), typ.NumMethod())
for i := 0; i < typ.NumMethod(); i++ {
method := typ.Method(i)
if method.Type.NumIn() == 4 { //&& // TODO 接收者 + 2个参数 一个是类型,一个是player
//method.Type.In(1) == reflect.TypeOf([]byte{}
// 获取方法值
methodValue := value.MethodByName(method.Name)
// 准备参数
cmd1 := method.Name[len("Recv_"):len(method.Name)]
cmdint, _ := strconv.Atoi(cmd1)
if cmdint == int(pp.CMDID) {
if !cmd.Isexist(cmd.CommandID, cmd.EnumCommandID(pp.CMDID)) {
fmt.Println("ID方法存在cmd未注册", pp.CMDID, cmd.CommandID)
}
maincmdcache.Store(pp.CMDID, methodValue) //TODO 待实现对不同用户初始化方法以取消全局cmdcache
callhandler(methodValue, data, player, cmd.EnumCommandID(pp.CMDID))
}
//return
}
//}
}
}
}
func callhandler(cmdlister reflect.Value, data []byte, player *entity.Player, cmd cmd.EnumCommandID) {
//TODO 待实现返回参数返回客户端???实现直接返回对象进行序列化 传递chan待返回
//TODO 已实现,待测试
recvchan := make(chan any, 1) //传递自定义chan
go func() {
retv := <-recvchan
switch ttt := retv.(type) {
case []byte:
player.SendPackBytes(cmd, ttt)
default:
var data1 bytes.Buffer
struc.Unpack(&data1, &ttt)
player.SendPackBytes(cmd, data1.Bytes())
}
}()
cmdlister.Call([]reflect.Value{
reflect.ValueOf(data),
reflect.ValueOf(player),
reflect.ValueOf(recvchan),
})
}
func getincodec(cmdid cmd.EnumCommandID, data []byte) reflect.Value {
// 获取对象的反射值和类型
value := reflect.ValueOf(maininfocodec)

View File

@@ -3,10 +3,24 @@ package login
import (
"blazing/common/core/info"
"blazing/common/data/entity"
"blazing/cool"
"context"
"encoding/hex"
"fmt"
"strings"
)
func OnData_1001(c info.LoginSidInfo, p entity.Player) {
fmt.Println(c.Sid)
func CheakSession(c info.LoginSidInfo, p *entity.Player) bool {
// tt, _ := cool.CacheManager.Keys(context.Background())
//g.Dump(tt)
t1 := hex.EncodeToString(c.Sid)
t2 := strings.Trim(t1, " ")
t, err := cool.CacheManager.Get(context.Background(), t2)
fmt.Println("后端获取", string(c.Sid), t, err)
if t.Uint32() == p.UserID {
return true
}
return false
}

View File

@@ -5,6 +5,6 @@ import (
"blazing/common/data/entity"
)
func OnData_105(c info.LoginSidInfo, p entity.Player) {
func OnData_105(c info.LoginSidInfo, p *entity.Player) {
}

View File

@@ -13,10 +13,15 @@ require (
github.com/jackc/puddle/v2 v2.2.1 // indirect
github.com/kr/pretty v0.3.0 // indirect
github.com/kr/text v0.2.0 // indirect
github.com/panjf2000/ants/v2 v2.11.3 // indirect
github.com/redis/go-redis/v9 v9.5.1 // indirect
github.com/rogpeppe/go-internal v1.6.1 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
go.opentelemetry.io/otel/metric v1.24.0 // indirect
golang.org/x/sync v0.6.0 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/sync v0.11.0 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect
)
require (
@@ -38,11 +43,13 @@ require (
github.com/jinzhu/inflection v1.0.0 // indirect
github.com/jinzhu/now v1.1.5 // indirect
github.com/lib/pq v1.10.9 // indirect
github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543
github.com/magiconair/properties v1.8.7 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.15 // indirect
github.com/olekukonko/tablewriter v0.0.5 // indirect
github.com/panjf2000/gnet/v2 v2.9.1
github.com/rivo/uniseg v0.4.7 // indirect
github.com/robfig/cron v1.2.0 // indirect
go.opentelemetry.io/otel v1.24.0 // indirect
@@ -50,7 +57,7 @@ require (
go.opentelemetry.io/otel/trace v1.24.0 // indirect
golang.org/x/crypto v0.19.0 // indirect
golang.org/x/net v0.21.0 // indirect
golang.org/x/sys v0.17.0 // indirect
golang.org/x/sys v0.30.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

View File

@@ -56,6 +56,8 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543 h1:GxMuVb9tJajC1QpbQwYNY1ZAo1EIE8I+UclBjOfjz/M=
github.com/lunixbochs/struc v0.0.0-20241101090106-8d528fa2c543/go.mod h1:vy1vK6wD6j7xX6O6hXe621WabdtNkou2h7uRtTfRMyg=
github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
github.com/magiconair/properties v1.8.9 h1:nWcCbLq1N2v/cpNsy5WvQ37Fb+YElfq20WJ/a8RkpQM=
github.com/magiconair/properties v1.8.9/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
@@ -70,6 +72,10 @@ github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6T
github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w=
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
github.com/panjf2000/ants/v2 v2.11.3 h1:AfI0ngBoXJmYOpDh9m516vjqoUu2sLrIVgppI9TZVpg=
github.com/panjf2000/ants/v2 v2.11.3/go.mod h1:8u92CYMUc6gyvTIw8Ru7Mt7+/ESnJahz5EVtqfrilek=
github.com/panjf2000/gnet/v2 v2.9.1 h1:bKewICy/0xnQ9PMzNaswpe/Ah14w1TrRk91LHTcbIlA=
github.com/panjf2000/gnet/v2 v2.9.1/go.mod h1:WQTxDWYuQ/hz3eccH0FN32IVuvZ19HewEWx0l62fx7E=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/redis/go-redis/v9 v9.5.1/go.mod h1:hdY0cQFCN4fnSYT6TkisLufl/4W5UIXyv0b/CLO2V2M=
@@ -85,6 +91,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo=
go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U=
go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg=
@@ -97,16 +105,24 @@ go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJC
go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU=
go.opentelemetry.io/otel/trace v1.32.0 h1:WIC9mYrXf8TmY/EXuULKc8hR17vE+Hjv2cssQDe03fM=
go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU=
golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w=
golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc=
golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
@@ -116,6 +132,8 @@ gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc=
gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View File

@@ -1,10 +1,16 @@
package main
import (
"bytes"
"context"
"encoding/hex"
"fmt"
_ "github.com/gogf/gf/contrib/nosql/redis/v2"
"github.com/lunixbochs/struc"
"github.com/panjf2000/gnet/v2"
"blazing/common/core/info/login"
"blazing/common/socket"
"blazing/common/socket/handler"
_ "blazing/contrib/files/local"
@@ -38,14 +44,61 @@ func Start(port string) {
head := handler.NewTomeeHandler()
head.Callback = recv
socket.NewServer(socket.WithPort(port), socket.WithSocketHandler(head)).Start()
socket.NewServer(socket.WithPort(port), socket.WithCORS(), socket.WithSocketHandler(head)).Start()
}
func recv(data handler.TomeeHeader) {
func recv(c gnet.Conn, data handler.TomeeHeader) {
fmt.Println(data)
t, _ := cool.CacheManager.Get(context.Background(), data.Data)
fmt.Println(t.String())
ret := login.NewCommendSvrInfo()
lofin := login.NewServerInfo()
lofin.OnlineID = 1
lofin.UserCnt = 77
lofin.IP = "127.0.0.1"
lofin.Port = 27777
lofin.Friends = 1
ret.ServerList = append(ret.ServerList, *lofin)
var trr bytes.Buffer
err := struc.Pack(&trr, ret)
fmt.Println(err)
t11, _ := struc.Sizeof(ret)
t1 := handler.TomeeHeader{
Len: uint32(t11 + 17),
CMDID: 105,
Version: "7",
UserID: 1,
// Data: bytt.Bytes(),
}
var trr1 bytes.Buffer
err = struc.Pack(&trr1, &t1)
fmt.Println(hex.EncodeToString(trr1.Bytes()))
//0000003f3700000001000000000000006900000000
//0000003f37000000690000000100000000
//0000003F3700000069000186A600000000
fmt.Println(hex.EncodeToString(trr.Bytes()))
c.Write(trr1.Bytes())
c.Write(trr.Bytes())
// 处理接收到的TomeeHeader数据
// fmt.Println("收到数据:", data)
//processWithReflection(data)
}
func packheader(cmd, userid uint32, data []byte) *handler.TomeeHeader {
return &handler.TomeeHeader{
Len: uint32(63),
CMDID: 105,
Version: "7",
UserID: 1,
//Data: bytt.Bytes(),
}
}

View File

@@ -2,7 +2,6 @@ package middleware
import (
"blazing/modules/base/config"
"fmt"
"net/http"
"github.com/gogf/gf/v2/frame/g"
@@ -22,7 +21,7 @@ func MiddlewareCORS(r *ghttp.Request) {
r.Response.WriteStatus(http.StatusOK)
return
}
fmt.Println(r.Response.Header())
// fmt.Println(r.Response.Header())
//g.Dump(r.Response.Server.SetConfig(gtt))
//r.Response.Header().Del("Server") // 删除Server头
// r.Response.Header().Set("Server", "blazing")

View File

@@ -67,6 +67,7 @@ func (c *BlazingController) GetSession(ctx context.Context, req *SessionReq) (re
// 保存后端校验的SID
backendSID := res.Session[8 : len(res.Session)-8]
fmt.Println("存储sid", backendSID)
if err := service.NewLoginServiceService().SaveSessionId(backendSID, gconv.String(accountID)); err != nil {
res.Code = 400
res.Msg = err.Error()

View File

@@ -2,6 +2,12 @@ package service
import (
"blazing/cool"
"context"
"fmt"
"strings"
"time"
"github.com/gogf/gf/v2/os/gctx"
)
type LoginService struct {
@@ -14,8 +20,13 @@ func NewLoginServiceService() *LoginService {
}
}
func (s *LoginService) SaveSessionId(session, userid string) error {
func (s *LoginService) SaveSessionId(session string, userid string) error {
cool.CacheManager.Set(gctx.New(), strings.Trim(session, " "), userid, time.Hour*24)
// gsvc.SetRegistry(etcd.New(`127.0.0.1:2379`))
t, err := cool.CacheManager.Contains(context.Background(), strings.Trim(session, " "))
fmt.Println("前端获取", session, t, err)
return nil
}

9232
public/xml/item_info.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,103 @@
<experience_list>
<level exp="0">0</level>
<level exp="10">1</level>
<level exp="23">2</level>
<level exp="47">3</level>
<level exp="76">4</level>
<level exp="114">5</level>
<level exp="158">6</level>
<level exp="212">7</level>
<level exp="271">8</level>
<level exp="339">9</level>
<level exp="413">10</level>
<level exp="497">11</level>
<level exp="586">12</level>
<level exp="684">13</level>
<level exp="788">14</level>
<level exp="902">15</level>
<level exp="1021">16</level>
<level exp="1149">17</level>
<level exp="1283">18</level>
<level exp="1427">19</level>
<level exp="1576">20</level>
<level exp="1734">21</level>
<level exp="1898">22</level>
<level exp="2072">23</level>
<level exp="2251">24</level>
<level exp="2439">25</level>
<level exp="2633">26</level>
<level exp="2837">27</level>
<level exp="3046">28</level>
<level exp="3264">29</level>
<level exp="3488">30</level>
<level exp="3721">31</level>
<level exp="3961">32</level>
<level exp="4209">33</level>
<level exp="4463">34</level>
<level exp="4727">35</level>
<level exp="4996">36</level>
<level exp="5274">37</level>
<level exp="5558">38</level>
<level exp="5852">39</level>
<level exp="6151">40</level>
<level exp="6459">41</level>
<level exp="6773">42</level>
<level exp="7097">43</level>
<level exp="7426">44</level>
<level exp="7764">45</level>
<level exp="8108">46</level>
<level exp="8462">47</level>
<level exp="8821">48</level>
<level exp="9189">49</level>
<level exp="9563">50</level>
<level exp="9947">51</level>
<level exp="10336">52</level>
<level exp="10734">53</level>
<level exp="11138">54</level>
<level exp="11552">55</level>
<level exp="11971">56</level>
<level exp="12399">57</level>
<level exp="12833">58</level>
<level exp="13277">59</level>
<level exp="13726">60</level>
<level exp="14184">61</level>
<level exp="14648">62</level>
<level exp="15122">63</level>
<level exp="15601">64</level>
<level exp="16089">65</level>
<level exp="16583">66</level>
<level exp="17087">67</level>
<level exp="17596">68</level>
<level exp="18114">69</level>
<level exp="18638">70</level>
<level exp="19172">71</level>
<level exp="19711">72</level>
<level exp="20259">73</level>
<level exp="20813">74</level>
<level exp="21377">75</level>
<level exp="21946">76</level>
<level exp="22524">77</level>
<level exp="23108">78</level>
<level exp="23702">79</level>
<level exp="24301">80</level>
<level exp="24909">81</level>
<level exp="25523">82</level>
<level exp="26147">83</level>
<level exp="26776">84</level>
<level exp="27414">85</level>
<level exp="28058">86</level>
<level exp="28712">87</level>
<level exp="29371">88</level>
<level exp="30039">89</level>
<level exp="30713">90</level>
<level exp="31397">91</level>
<level exp="32086">92</level>
<level exp="32784">93</level>
<level exp="33488">94</level>
<level exp="34202">95</level>
<level exp="34921">96</level>
<level exp="35650">97</level>
<level exp="36383">98</level>
<level exp="37127">99</level>
<level exp="37876">100</level>
</experience_list>

View File

@@ -0,0 +1,36 @@
<?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>

1488
public/xml/map_info.xml Normal file

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,58 @@
<!--以Group为单位, ItemGroup表示特性组所需要的材料清单, Idx表示材料的提交顺序, material-->
<MaterialTraitsList>
<Group>
<ItemGroup>
<Item ID="400030" Idx="1"/>
<Item ID="400030" Idx="2"/>
<Item ID="400030" Idx="3"/>
<Item ID="400028" Idx="4"/>
</ItemGroup>
<MaterialGroup>
<Material ID="1008" />
<Material ID="1018" />
<Material ID="1023" />
<Material ID="1031" />
</MaterialGroup>
</Group>
</MaterialTraitsList>
<!--Idx="1006" Desc="叶绿" Desc2="草属性技能伤害增加5%"-->
<!--Idx="1007" Desc="流水" Desc2="水属性技能伤害增加5%"-->
<!--Idx="1008" Desc="炎火" Desc2="火属性技能伤害增加5%"-->
<!--Idx="1009" Desc="飞空" Desc2="飞行属性技能伤害增加5%"-->
<!--Idx="1010" Desc="蓄电" Desc2="电属性技能伤害增加5%"-->
<!--Idx="1011" Desc="机能" Desc2="机械属性技能伤害增加5%"-->
<!--Idx="1012" Desc="碎裂" Desc2="地面属性技能伤害增加5%"-->
<!--Idx="1013" Desc="平衡" Desc2="普通属性技能伤害增加5%"-->
<!--Idx="1014" Desc="冰霜" Desc2="冰属性技能伤害增加5%"-->
<!--Idx="1015" Desc="魔幻" Desc2="超能属性技能伤害增加5%"-->
<!--Idx="1016" Desc="战意" Desc2="战斗属性技能伤害增加5%"-->
<!--Idx="1017" Desc="光环" Desc2="光属性技能伤害增加5%"-->
<!--Idx="1018" Desc="黑夜" Desc2="暗影属性技能伤害增加5%"-->
<!--Idx="1019" Desc="奇异" Desc2="神秘属性技能伤害增加5%"-->
<!--Idx="1020" Desc="威严" Desc2="龙属性技能伤害增加5%"-->
<!--Idx="1021" Desc="圣灵?" Desc2="圣灵属性技能伤害增加5%"-->
<!--Idx="1022" Desc="精准" Desc2="所有技能命中率增加5%"-->
<!--Idx="1023" Desc="会心" Desc2="所有技能的致命一击率增加1/16"-->
<!--Idx="1024" Desc="坚硬" Desc2="受到的伤害减少5%"-->
<!--Idx="1025" Desc="回避" Desc2="被技能命中的几率减少5%"-->
<!--Idx="1026" Desc="顽强" Desc2="受到致死攻击时有3%几率余下1点体力"-->
<!--Idx="1027" Desc="瞬杀" Desc2="进攻类技能有3%几率秒杀对方"-->
<!--Idx="1028" Desc="回神" Desc2="精灵体力降低到1/8时有3%几率体力回满"-->
<!--Idx="1029" Desc="带电" Desc2="受到普通攻击时有3%几率使对方麻痹"-->
<!--Idx="1030" Desc="中毒" Desc2="受到普通攻击时有3%几率使对方中毒"-->
<!--Idx="1031" Desc="高热" Desc2="受到普通攻击时有3%几率使对方烧伤"-->
<!--Idx="1032" Desc="冰冷" Desc2="受到普通攻击时有3%几率使对方冻伤"-->
<!--Idx="1033" Desc="阴森" Desc2="受到普通攻击时有3%几率使对方害怕"-->
<!--Idx="1034" Desc="睡眠" Desc2="受到普通攻击时有3%几率使对方睡眠"-->
<!--Idx="1035" Desc="反抗" Desc2="受到特殊攻击时有5%概率使对面攻击降低1个等级"-->
<!--Idx="1036" Desc="反驳" Desc2="受到特殊攻击时有5%概率使对面防御降低1个等级"-->
<!--Idx="1037" Desc="忽略" Desc2="受到特殊攻击时有5%概率使对面特攻降低1个等级"-->
<!--Idx="1038" Desc="草率" Desc2="受到特殊攻击时有5%概率使对面特防降低1个等级"-->
<!--Idx="1040" Desc="慌张" Desc2="受到特殊攻击时有5%概率使对面速度降低1个等级"-->
<!--Idx="1041" Desc="反击" Desc2="受到任何攻击时有5%概率使自身攻击提升1个等级"-->
<!--Idx="1042" Desc="抵抗" Desc2="受到任何攻击时有5%概率使自身防御提升1个等级"-->
<!--Idx="1043" Desc="反攻" Desc2="受到任何攻击时有5%概率使自身特攻提升1个等级"-->
<!--Idx="1044" Desc="坚韧" Desc2="受到任何攻击时有5%概率使自身特防提升1个等级"-->
<!--Idx="1045" Desc="借风" Desc2="受到任何攻击时有5%概率使自身速度提升1个等级"-->

View File

@@ -0,0 +1,121 @@
<?xml version="1.0" encoding="UTF-8" ?>
<monsters xmlns="nieo.seer.org.monster-refresh">
<map id="10" desc="克洛斯星">
<monster id="10" desc="皮皮" min_level="1" max_level="2" capturable="true" rate="0.97"/>
<monster id="164" desc="闪光皮皮" min_level="1" max_level="2" capturable="true" rate="0.02"/>
<monster id="1" desc="布布种子" min_level="1" max_level="2" capturable="true" rate="0.01"/>
</map>
<map id="11" desc="克洛斯星沼泽">
<monster id="16" desc="仙人球" min_level="11" max_level="12" capturable="true" rate="0.97"/>
<monster id="27" desc="小豆芽" min_level="11" max_level="12" capturable="true" rate="0.03"/>
<monster id="122" desc="达尔" min_level="1" max_level="1" capturable="true" rate="0.00024">
<restrictions type="timePolicy" value="19:00-24:00"/>
</monster>
</map>
<map id="15" desc="火山星">
<monster id="38" desc="火炎贝" min_level="7" max_level="8" capturable="true" rate="0.99"/>
<monster id="7" desc="小火猴" min_level="12" max_level="12" capturable="true" rate="0.01"/>
</map>
<map id="16" desc="火山星山洞">
<monster id="35" desc="吉尔" min_level="11" max_level="12" capturable="true" rate="0.6"/>
<monster id="37" desc="洛吉拉斯" min_level="46" max_level="46" capturable="false" rate="0.39"/>
<monster id="133" desc="巴多" min_level="14" max_level="14" capturable="true" rate="0.01"/>
</map>
<map id="17" desc="火山星山洞深处">
<monster id="335" desc="赤甲虫" min_level="15" max_level="16" capturable="true" rate="0.59"/>
<monster id="337" desc="赤西西比" min_level="40" max_level="40" capturable="false" rate="0.4"/>
<monster id="62" desc="格林" min_level="16" max_level="16" capturable="true" rate="0.01"/>
</map>
<map id="20" desc="海洋星">
<monster id="30" desc="贝尔" min_level="5" max_level="6" capturable="true" rate="0.99"/>
<monster id="4" desc="伊优" min_level="11" max_level="12" capturable="true" rate="0.01"/>
</map>
<map id="21" desc="海洋星深水区">
<monster id="33" desc="利牙鱼" min_level="15" max_level="16" capturable="true" rate="0.99"/>
<monster id="108" desc="布鲁" min_level="12" max_level="13" capturable="true" rate="0.01"/>
</map>
<map id="22" desc="海洋星海底">
<monster id="198" desc="小鳍鱼" min_level="14" max_level="15" capturable="true" rate="0.59"/>
<monster id="199" desc="贝壳鱼" min_level="26" max_level="26" capturable="false" rate="0.40"/>
<monster id="108" desc="布鲁" min_level="12" max_level="13" capturable="true" rate="0.01"/>
</map>
<map id="25" desc="云霄星">
<monster id="22" desc="毛毛" min_level="3" max_level="4" capturable="true" rate="0.99"/>
<monster id="53" desc="莫比" min_level="3" max_level="4" capturable="true" rate="0.01"/>
</map>
<map id="26" desc="云霄星高空层">
<monster id="25" desc="幽浮" min_level="3" max_level="14" capturable="true" rate="0.6"/>
<monster id="26" desc="哈尔浮" min_level="26" max_level="26" capturable="false" rate="0.4"/>
</map>
<map id="27" desc="云霄星最高层">
<monster id="249" desc="浮空苗" min_level="13" max_level="14" capturable="true" rate="0.6"/>
<monster id="251" desc="萨洛姆斯" min_level="36" max_level="36" capturable="false" rate="0.4"/>
</map>
<map id="30" desc="赫尔卡星">
<monster id="13" desc="比比鼠" min_level="13" max_level="14" capturable="true" rate="0.99"/>
<monster id="59" desc="西塔" min_level="5" max_level="5" capturable="true" rate="0.01"/>
</map>
<map id="31" desc="赫尔卡星遗迹">
<monster id="43" desc="罗奇" min_level="19" max_level="20" capturable="true" rate="0.58"/>
<monster id="45" desc="西萨琉拉" min_level="31" max_level="31" capturable="false" rate="0.4"/>
<monster id="19" desc="利利" min_level="5" max_level="5" capturable="true" rate="0.01"/>
<monster id="284" desc="闪光利利" min_level="5" max_level="5" capturable="true" rate="0.01"/>
</map>
<map id="33" desc="神秘通道">
<monster id="145" desc="吉斯" min_level="15" max_level="20" capturable="true" rate="1"/>
</map>
<map id="40" desc="塞西莉亚星">
<monster id="116" desc="卡卡" min_level="14" max_level="15" capturable="true" rate="0.6"/>
<monster id="117" desc="利兹" min_level="40" max_level="40" capturable="false" rate="0.4"/>
</map>
<map id="41" desc="寒冰溶洞">
<monster id="67" desc="布林克斯" min_level="40" max_level="40" capturable="false" rate="0.99"/>
<monster id="65" desc="林克" min_level="14" max_level="14" capturable="true" rate="0.01"/>
</map>
<map id="43" desc="赫尔卡飞船">
<monster id="51" desc="玄冰兽" min_level="25" max_level="26" capturable="true" rate="0.6"/>
<monster id="52" desc="急冻兽" min_level="45" max_level="45" capturable="false" rate="0.4"/>
</map>
<map id="105" desc="双子阿尔法星">
<monster id="89" desc="迪达" min_level="16" max_level="17" capturable="true" rate="0.6"/>
<monster id="90" desc="迪尔克" min_level="36" max_level="36" capturable="false" rate="0.4"/>
</map>
<map id="106" desc="阿尔法星岩地">
<monster id="188" desc="加格" min_level="17" max_level="18" capturable="true" rate="0.6"/>
<monster id="189" desc="加格尔" min_level="36" max_level="36" capturable="false" rate="0.4"/>
</map>
<map id="46" desc="海盗能源站">
<monster id="97" desc="鲁克" min_level="25" max_level="26" capturable="true" rate="0.6"/>
<monster id="98" desc="卡鲁加" min_level="40" max_level="40" capturable="false" rate="0.4"/>
</map>
<map id="47" desc="双子贝塔星">
<monster id="119" desc="莱尼" min_level="15" max_level="16" capturable="true" rate="0.6"/>
<monster id="120" desc="特鲁尼" min_level="40" max_level="40" capturable="false" rate="0.4"/>
</map>
<map id="48" desc="海盗要塞废墟">
<monster id="184" desc="古鲁" min_level="17" max_level="18" capturable="true" rate="0.6"/>
<monster id="185" desc="梅鲁" min_level="40" max_level="40" capturable="false" rate="0.4"/>
</map>
<map id="49" desc="贝塔星荒原">
<monster id="105" desc="丁格" min_level="15" max_level="16" capturable="true" rate="0.2"/>
<monster id="106" desc="丁加鲁" min_level="26" max_level="26" capturable="false" rate="0.3"/>
<monster id="107" desc="丁鲁特" min_level="41" max_level="41" capturable="false" rate="0.5"/>
</map>
<map id="54" desc="露希欧星">
<monster id="205" desc="阿兹" min_level="16" max_level="17" capturable="true" rate="0.6"/>
<monster id="206" desc="科利" min_level="36" max_level="36" capturable="false" rate="0.4"/>
</map>
<map id="55" desc="露希欧泥潭">
<monster id="208" desc="火晶兽" min_level="16" max_level="17" capturable="true" rate="0.69"/>
<monster id="210" desc="多鲁姆" min_level="36" max_level="36" capturable="false" rate="0.3"/>
<monster id="203" desc="晶岩兽" min_level="17" max_level="18" capturable="true" rate="0.01"/>
</map>
<map id="56" desc="露希欧之洋">
<monster id="211" desc="水草蛙" min_level="11" max_level="12" capturable="true" rate="1"/>
</map>
<map id="316" desc="精灵舱">
<monster id="136" desc="卢比" min_level="11" max_level="12" capturable="true" rate="0.8"/>
<monster id="172" desc="黑火贝" min_level="11" max_level="12" capturable="true" rate="0.2"/>
</map>
</monsters>

View File

@@ -0,0 +1,244 @@
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="nieo.seer.org.monster-refresh"
xmlns="nieo.seer.org.monster-refresh"
elementFormDefault="qualified">
<xs:element name="monster">
<xs:annotation>
<xs:documentation><![CDATA[
怪物刷新规范, 其中:
- id: 要刷新的精灵ID
- desc: 精灵描述
- min_level: 允许出现的最低等级
- max_level: 允许出现的最高等级
- rate: 刷新概率
]]></xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:choice minOccurs="0">
<xs:element ref="restrictions" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
<xs:attributeGroup ref="monsterAttributeGroup"/>
</xs:complexType>
</xs:element>
<xs:simpleType name="location_id">
<xs:annotation>
<xs:documentation><![CDATA[
位置ID, 允许输入范围为1-9
]]></xs:documentation>
</xs:annotation>
<xs:restriction base="xs:integer">
<xs:enumeration value="1">
<xs:annotation>
<xs:documentation><![CDATA[
1号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="2">
<xs:annotation>
<xs:documentation><![CDATA[
2号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="3">
<xs:annotation>
<xs:documentation><![CDATA[
3号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="4">
<xs:annotation>
<xs:documentation><![CDATA[
4号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="5">
<xs:annotation>
<xs:documentation><![CDATA[
5号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="6">
<xs:annotation>
<xs:documentation><![CDATA[
6号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="7">
<xs:annotation>
<xs:documentation><![CDATA[
7号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="8">
<xs:annotation>
<xs:documentation><![CDATA[
8号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="9">
<xs:annotation>
<xs:documentation><![CDATA[
9号刷新位置
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:element name="location">
<xs:annotation>
<xs:documentation><![CDATA[
在指定ID的位置特定的刷新规范, 将与默认的组合, 全部的概率之和作为总概率
]]></xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="monster" maxOccurs="unbounded"/>
</xs:sequence>
<xs:attribute id="location_id" name="id" type="location_id" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
此位置的ID, 允许范围[1, 9]
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="location_combined" name="combined" type="xs:boolean" default="true">
<xs:annotation>
<xs:documentation><![CDATA[
是否将此特定位置下的精灵刷新规则与默认规则合并计算, 默认为true
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element id="monster_restrictions" name="restrictions">
<xs:annotation>
<xs:documentation><![CDATA[
此精灵刷新的限制条件
]]></xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute id="monster_restrictions_type" name="type" type="type" use="required"/>
<xs:attribute id="monster_restrictions_value" name="value" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
<xs:simpleType id="monster_restrictions_type_enum" name="type">
<xs:annotation>
<xs:documentation><![CDATA[
限制条件的类型
]]></xs:documentation>
</xs:annotation>
<xs:restriction base="xs:string">
<xs:enumeration value="timePolicy"/>
</xs:restriction>
</xs:simpleType>
<xs:attributeGroup name="monsterAttributeGroup">
<xs:annotation>
<xs:documentation><![CDATA[
怪物刷新属性组
]]></xs:documentation>
</xs:annotation>
<xs:attribute id="monster_id" name="id" type="xs:integer" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
此精灵的ID
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="monster_desc" name="desc" type="xs:string" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
此精灵的描述信息
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="monster_min_level" name="min_level" type="xs:integer" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
此精灵可能出现的最低等级
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="monster_max_level" name="max_level" type="xs:integer" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
此精灵可能出现的最高等级
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="monster_capturable" name="capturable" type="xs:boolean" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
此精灵是否允许捕捉
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="monster_rate" name="rate" type="xs:float" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
此精灵刷新的概率
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:attributeGroup>
<xs:element name="map">
<xs:annotation>
<xs:documentation><![CDATA[
地图刷新精灵的相关配置, 其中
- id: 地图ID
- desc: 地图描述信息
此标签下允许出现若干monster标签, 用作默认刷新配置, 此外,
还允许额外出现location标签, 代表只会在某个位置进行额外的概率计算.
通常情况下, 为了减少重复输入的内容, location标签下的概率会结合默认内容进行合并计算,
但是可以通过设置属性combined=false单独使用location下内容计算.
]]></xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="monster" maxOccurs="unbounded"/>
<xs:element ref="location" minOccurs="0" maxOccurs="9"/>
</xs:sequence>
<xs:attribute id="map_id" name="id" type="xs:integer" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
地图ID, 类型为数字类型
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="map_desc" name="desc" type="xs:string" use="required">
<xs:annotation>
<xs:documentation><![CDATA[
地图的描述信息
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:element name="monsters">
<xs:annotation>
<xs:documentation><![CDATA[
精灵刷新的配置信息
]]></xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="map" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>

View File

@@ -0,0 +1,28 @@
<!-- 性格修正 -->
<root>
<item id="0" name="孤独" m_attack="1.1" m_defence="0.9" m_SA="1" m_SD="1" m_speed="1" desc="攻击+ 防御-"/>
<item id="1" name="固执" m_attack="1.1" m_defence="1" m_SA="0.9" m_SD="1" m_speed="1" desc="攻击+ 特攻-"/>
<item id="2" name="调皮" m_attack="1.1" m_defence="1" m_SA="1" m_SD="0.9" m_speed="1" desc="攻击+ 特防-"/>
<item id="3" name="勇敢" m_attack="1.1" m_defence="1" m_SA="1" m_SD="1" m_speed="0.9" desc="攻击+ 速度-"/>
<item id="4" name="大胆" m_attack="0.9" m_defence="1.1" m_SA="1" m_SD="1" m_speed="1" desc="防御+ 攻击-"/>
<item id="5" name="顽皮" m_attack="1" m_defence="1.1" m_SA="0.9" m_SD="1" m_speed="1" desc="防御+ 特攻-"/>
<item id="6" name="无虑" m_attack="1" m_defence="1.1" m_SA="1" m_SD="0.9" m_speed="1" desc="防御+ 特防-"/>
<item id="7" name="悠闲" m_attack="1" m_defence="1.1" m_SA="1" m_SD="1" m_speed="0.9" desc="防御+ 速度-"/>
<item id="8" name="保守" m_attack="0.9" m_defence="1" m_SA="1.1" m_SD="1" m_speed="1" desc="特攻+ 攻击-"/>
<item id="9" name="稳重" m_attack="1" m_defence="0.9" m_SA="1.1" m_SD="1" m_speed="1" desc="特攻+ 防御-"/>
<item id="10" name="马虎" m_attack="1" m_defence="1" m_SA="1.1" m_SD="0.9" m_speed="1" desc="特攻+ 特防-"/>
<item id="11" name="冷静" m_attack="1" m_defence="1" m_SA="1.1" m_SD="1" m_speed="0.9" desc="特攻+ 速度-"/>
<item id="12" name="沉着" m_attack="0.9" m_defence="1" m_SA="1" m_SD="1.1" m_speed="1" desc="特防+ 攻击-"/>
<item id="13" name="温顺" m_attack="1" m_defence="0.9" m_SA="1" m_SD="1.1" m_speed="1" desc="特防+ 防御-"/>
<item id="14" name="慎重" m_attack="1" m_defence="1" m_SA="0.9" m_SD="1.1" m_speed="1" desc="特防+ 特攻-"/>
<item id="15" name="狂妄" m_attack="1" m_defence="1" m_SA="1" m_SD="1.1" m_speed="0.9" desc="特防+ 速度-"/>
<item id="16" name="胆小" m_attack="0.9" m_defence="1" m_SA="1" m_SD="1" m_speed="1.1" desc="速度+ 攻击-"/>
<item id="17" name="急躁" m_attack="1" m_defence="0.9" m_SA="1" m_SD="1" m_speed="1.1" desc="速度+ 防御-"/>
<item id="18" name="开朗" m_attack="1" m_defence="1" m_SA="0.9" m_SD="1" m_speed="1.1" desc="速度+ 特攻-"/>
<item id="19" name="天真" m_attack="1" m_defence="1" m_SA="1" m_SD="0.9" m_speed="1.1" desc="速度+ 特防-"/>
<item id="20" name="害羞" m_attack="1" m_defence="1" m_SA="1" m_SD="1" m_speed="1" desc="平衡发展"/>
<item id="21" name="实干" m_attack="1" m_defence="1" m_SA="1" m_SD="1" m_speed="1" desc="平衡发展"/>
<item id="22" name="坦率" m_attack="1" m_defence="1" m_SA="1" m_SD="1" m_speed="1" desc="平衡发展"/>
<item id="23" name="浮躁" m_attack="1" m_defence="1" m_SA="1" m_SD="1" m_speed="1" desc="平衡发展"/>
<item id="24" name="认真" m_attack="1" m_defence="1" m_SA="1" m_SD="1" m_speed="1" desc="平衡发展"/>
</root>

View File

@@ -0,0 +1,9 @@
<!--FusionTable表示融合组, MainPetId是融合主精灵的typeId, SubPetId表示融合副精灵的typeId-->
<!--Group对应融合的结果组, prop表示取得随机数的区间下限, 以闪光尼尔和卡鲁为例, 若概率取值为0-79则为闪光尼尔, 若为80-100则为卡鲁-->
<!--Group的值对应的是融合出来的typeId, ItemId表示融合成功后发送的元神珠物品的id-->
<PetFusions>
<FusionTable MainPetId="79" SubPetId="164 165 166">
<Group prop="0" ItemId="1000009">312</Group>
<Group prop="80" ItemId="1000008">315</Group>
</FusionTable>
</PetFusions>

24293
public/xml/pet_info.xml Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

43
public/xml/talk_count.xml Normal file
View File

@@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8" ?>
<talk_count xmlns="nieo.seer.org.talk-count">
<entry id="1" item_id="400001" item_min_count="1" item_max_count="10" desc="克罗斯星黄晶矿" count="5"/>
<entry id="2" item_id="400001" item_min_count="1" item_max_count="10" desc="海洋星黄晶矿" count="5"/>
<entry id="3" item_id="400001" item_min_count="1" item_max_count="10" desc="火山星黄晶矿" count="5"/>
<entry id="4" item_id="400002" item_min_count="1" item_max_count="10" desc="海洋星甲烷燃气" count="2"/>
<entry id="5" item_id="400002" item_min_count="1" item_max_count="10" desc="云霄星甲烷燃气" count="2"/>
<entry id="6" item_id="400002" item_min_count="1" item_max_count="10" desc="火山星甲烷燃气" count="2"/>
<entry id="7" item_id="400009" item_min_count="1" item_max_count="10" desc="藤结晶" count="1"/>
<entry id="8" item_id="3" item_min_count="1000" item_max_count="1000" desc="累积经验1000" count="1"/>
<entry id="9" item_id="400010" item_min_count="1" item_max_count="10" desc="蘑菇结晶" count="3"/>
<entry id="10" item_id="400011" item_min_count="1" item_max_count="10" desc="纳格晶体" count="3"/>
<entry id="11" item_id="400012" item_min_count="1" item_max_count="10" desc="豆豆果实" count="1"/>
<entry id="12" item_id="400016" item_min_count="1" item_max_count="10" desc="电能石" count="3"/>
<entry id="13" item_id="400018" item_min_count="1" item_max_count="10" desc="绿斯诺豌豆" count="5"/>
<entry id="14" item_id="400023" item_min_count="1" item_max_count="10" desc="露尼亚矿石" count="1"/>
<entry id="15" item_id="400024" item_min_count="1" item_max_count="10" desc="希罗里矿石" count="1"/>
<entry id="16" item_id="400025" item_min_count="1" item_max_count="10" desc="欧古德矿石" count="1"/>
<entry id="17" item_id="400001" item_min_count="1" item_max_count="10" desc="黄晶矿" count="5"/>
<entry id="18" item_id="400035" item_min_count="1" item_max_count="10" desc="露希欧坚钢" count="6"/>
<entry id="19" item_id="400036" item_min_count="1" item_max_count="10" desc="尼古滴露" count="5"/>
<entry id="20" item_id="300002" item_min_count="1" item_max_count="1" desc="中级精灵胶囊" count="1"/>
<entry id="21" item_id="300012" item_min_count="1" item_max_count="1" desc="中级体力药剂" count="1"/>
<entry id="22" item_id="600001" item_min_count="1" item_max_count="1" desc="烟花" count="5"/>
<entry id="23" item_id="600004" item_min_count="1" item_max_count="1" desc="周年庆烟花" count="5"/>
<entry id="24" item_id="300002" item_min_count="1" item_max_count="1" desc="中级精灵胶囊" count="1"/>
<entry id="25" item_id="300012" item_min_count="1" item_max_count="1" desc="中级体力药剂" count="1"/>
<entry id="27" item_id="400001" item_min_count="1" item_max_count="10" desc="黄晶矿" count="5"/>
<entry id="28" item_id="400001" item_min_count="1" item_max_count="10" desc="黄晶矿" count="5"/>
<entry id="29" item_id="400001" item_min_count="1" item_max_count="10" desc="黄晶矿" count="5"/>
<entry id="30" item_id="400002" item_min_count="1" item_max_count="10" desc="甲烷燃气" count="5"/>
<entry id="31" item_id="400001" item_min_count="1" item_max_count="10" desc="黄晶矿" count="5"/>
<entry id="32" item_id="400001" item_min_count="1" item_max_count="10" desc="黄晶矿" count="5"/>
<entry id="33" item_id="400002" item_min_count="1" item_max_count="10" desc="甲烷燃气" count="5"/>
<entry id="34" item_id="400001" item_min_count="1" item_max_count="10" desc="黄晶矿" count="5"/>
<entry id="35" item_id="400002" item_min_count="1" item_max_count="10" desc="甲烷燃气" count="5"/>
<entry id="36" item_id="400002" item_min_count="1" item_max_count="10" desc="甲烷燃气" count="2"/>
<entry id="37" item_id="400002" item_min_count="1" item_max_count="10" desc="甲烷燃气" count="2"/>
<entry id="2051" item_id="400501" item_min_count="1" item_max_count="1" desc="神奇扭蛋牌" count="1" policy="week"/>
<entry id="2054" item_id="400026" item_min_count="1" item_max_count="2" desc="水草蛙处希欧珊瑚" count="1"/>
</talk_count>

115
public/xml/talk_count.xsd Normal file
View File

@@ -0,0 +1,115 @@
<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="nieo.seer.org.talk-count"
xmlns="nieo.seer.org.talk-count"
elementFormDefault="qualified">
<xs:element id="entry" name="entry">
<xs:annotation>
<xs:documentation><![CDATA[
具体奖励领取的设置信息
]]></xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:attribute id="id" name="id" use="required" type="xs:integer">
<xs:annotation>
<xs:documentation><![CDATA[
此奖励项的ID
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="item_id" name="item_id" use="required" type="xs:integer">
<xs:annotation>
<xs:documentation><![CDATA[
此奖励项所对应的物品ID
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="item_min_count" name="item_min_count" use="required" type="xs:nonNegativeInteger">
<xs:annotation>
<xs:documentation><![CDATA[
此奖励物品的最少数量
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="item_max_count" name="item_max_count" use="required" type="xs:nonNegativeInteger">
<xs:annotation>
<xs:documentation><![CDATA[
此奖励物品的最大数量
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="desc" name="desc" use="required" type="xs:string">
<xs:annotation>
<xs:documentation><![CDATA[
此ID的描述信息
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="count" name="count" use="required" type="xs:nonNegativeInteger">
<xs:annotation>
<xs:documentation><![CDATA[
此奖励每日可领取的次数
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
<xs:attribute id="policy" name="policy" type="policy-type" default="day">
<xs:annotation>
<xs:documentation><![CDATA[
此奖励次数的刷新策略
]]></xs:documentation>
</xs:annotation>
</xs:attribute>
</xs:complexType>
</xs:element>
<xs:simpleType name="policy-type">
<xs:annotation>
<xs:documentation><![CDATA[
刷新策略
]]></xs:documentation>
</xs:annotation>
<xs:restriction>
<xs:enumeration value="day">
<xs:annotation>
<xs:documentation><![CDATA[
每日刷新奖励领取次数
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="week">
<xs:annotation>
<xs:documentation><![CDATA[
每周刷新奖励领取次数
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="month">
<xs:annotation>
<xs:documentation><![CDATA[
每月刷新奖励领取次数
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
<xs:enumeration value="once">
<xs:annotation>
<xs:documentation><![CDATA[
不会刷新奖励领取次数
]]></xs:documentation>
</xs:annotation>
</xs:enumeration>
</xs:restriction>
</xs:simpleType>
<xs:element id="talk_count" name="talk_count">
<xs:annotation>
<xs:documentation><![CDATA[
全部奖励领取次数的配置
]]></xs:documentation>
</xs:annotation>
<xs:complexType>
<xs:sequence>
<xs:element ref="entry" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>