DNF90 服务端与启动器完整源码(含 GM 工具功能增强)
服务端(Go): - GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面 - GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新 - 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新) - 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍 - 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0) - 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算 启动器(Python/JS): - 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭 - GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐) - 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
This commit is contained in:
commit
645b64fe21
4388 files changed
+1405457
No files matched your search
@@ -0,0 +1,150 @@
|
||||
package dnfbridge
|
||||
|
||||
import dnfrepo "longheng.io/server/internal/modules/dnf/repository"
|
||||
|
||||
func (r *csharpLegacyUserInfoReader) buildRawFixed(notiType uint16, expectedLength int) []byte {
|
||||
rows := r.queryRows("legacy_character_userinfo_fixed_raws",
|
||||
[]string{"noti_type", "payload"},
|
||||
[]string{"noti_type"},
|
||||
false)
|
||||
for _, row := range rows {
|
||||
if rowU16(row, "noti_type", 0) != notiType {
|
||||
continue
|
||||
}
|
||||
payload := rowBytes(row, "payload")
|
||||
if !legacyPayloadLengthOK(payload, expectedLength) {
|
||||
return nil
|
||||
}
|
||||
r.loaded = true
|
||||
return append([]byte(nil), payload...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (r *csharpLegacyUserInfoReader) buildRawBody(notiType uint16) []byte {
|
||||
rows := r.queryRows("legacy_character_userinfo_fixed_raws",
|
||||
[]string{"noti_type", "payload"},
|
||||
[]string{"noti_type"},
|
||||
false)
|
||||
for _, row := range rows {
|
||||
if rowU16(row, "noti_type", 0) != notiType {
|
||||
continue
|
||||
}
|
||||
payload := rowBytes(row, "payload")
|
||||
if len(payload) == 0 {
|
||||
return nil
|
||||
}
|
||||
r.loaded = true
|
||||
return append([]byte(nil), payload...)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func csharpRawUserInfoBody(notiType uint16) bool {
|
||||
switch notiType {
|
||||
case 0x040a, 0x0412, 0x041c, 0x041d, 0x041e:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
func csharpRawFixedUserInfoLength(notiType uint16) (int, bool) {
|
||||
switch notiType {
|
||||
case 0x0161, 0x01d9, 0x0343, 0x03fd, 0x0424, 0x0547, 0x0549:
|
||||
return 1, true
|
||||
case 0x0425, 0x0508:
|
||||
return 2, true
|
||||
case 0x0312, 0x03c7, 0x03e7, 0x040d, 0x040f, 0x0410, 0x0416, 0x0418,
|
||||
0x0419, 0x041a, 0x041b, 0x0435, 0x043e, 0x043f, 0x044e, 0x044f,
|
||||
0x0458, 0x0459, 0x0462, 0x0469, 0x046f, 0x0470, 0x048f, 0x04c6,
|
||||
0x04c7, 0x04ca, 0x04db, 0x04df, 0x050b, 0x050c, 0x0534:
|
||||
return 4, true
|
||||
case 0x0311, 0x0378, 0x0400, 0x040c, 0x0415, 0x04aa, 0x04f0, 0x04ff:
|
||||
return 5, true
|
||||
case 0x040e:
|
||||
return 6, true
|
||||
case 0x042a, 0x042c:
|
||||
return 7, true
|
||||
case 0x0373, 0x03d0, 0x0411, 0x048c, 0x04a6, 0x04a7, 0x04a9, 0x04f1,
|
||||
0x04f8, 0x050a, 0x052b, 0x0532, 0x0533:
|
||||
return 8, true
|
||||
case 0x03f3:
|
||||
return 9, true
|
||||
case 0x045a, 0x04c8:
|
||||
return 10, true
|
||||
case 0x0408:
|
||||
return 11, true
|
||||
case 0x03e8, 0x0409, 0x0428, 0x046c, 0x04b0, 0x04b1, 0x04da, 0x04ec,
|
||||
0x0518:
|
||||
return 12, true
|
||||
case 0x0407, 0x046b, 0x04fe:
|
||||
return 13, true
|
||||
case 0x0440:
|
||||
return 14, true
|
||||
case 0x0430:
|
||||
return 15, true
|
||||
case 0x042d, 0x0457:
|
||||
return 16, true
|
||||
case 0x048e, 0x04d5:
|
||||
return 17, true
|
||||
case 0x0406, 0x04b2:
|
||||
return 20, true
|
||||
case 0x0413:
|
||||
return 22, true
|
||||
case 0x0344:
|
||||
return 24, true
|
||||
case 0x052f:
|
||||
return 36, true
|
||||
case 0x0375, 0x052c:
|
||||
return 38, true
|
||||
case 0x0429, 0x042e:
|
||||
return 40, true
|
||||
case 0x0516:
|
||||
return 44, true
|
||||
case 0x04e2, 0x0515:
|
||||
return 48, true
|
||||
case 0x045f:
|
||||
return 54, true
|
||||
case 0x0514:
|
||||
return 58, true
|
||||
case 0x046e:
|
||||
return 61, true
|
||||
case 0x04d4:
|
||||
return 68, true
|
||||
case 0x040b:
|
||||
return 97, true
|
||||
case 0x050d:
|
||||
return 3504, true
|
||||
default:
|
||||
return 0, false
|
||||
}
|
||||
}
|
||||
|
||||
func (r *csharpLegacyUserInfoReader) buildRawByteCountList(notiType uint16, expectedRowLength int) []byte {
|
||||
rows := r.queryRows("legacy_character_userinfo_byte_count_raw_rows",
|
||||
[]string{"noti_type", "sort_order", "payload"},
|
||||
[]string{"noti_type", "sort_order"},
|
||||
false)
|
||||
filtered := make([]dnfrepo.LegacyUserInfoRow, 0, len(rows))
|
||||
for _, row := range rows {
|
||||
if rowU16(row, "noti_type", 0) == notiType {
|
||||
filtered = append(filtered, row)
|
||||
}
|
||||
}
|
||||
if len(filtered) == 0 {
|
||||
return nil
|
||||
}
|
||||
filtered = limitLegacyRowsU8(filtered)
|
||||
var w packetWriter
|
||||
w.writeByte(byte(len(filtered)))
|
||||
for _, row := range filtered {
|
||||
payload := rowBytes(row, "payload")
|
||||
if !legacyPayloadLengthOK(payload, expectedRowLength) {
|
||||
return nil
|
||||
}
|
||||
w.writeBytes(payload)
|
||||
}
|
||||
r.loaded = true
|
||||
return w.bytes()
|
||||
}
|
||||
Reference in new issue
Block a user