Files
90CNServer/server/internal/services/dnfbridge/userinfo_legacy_build_0109_0184.go
T
hanfuit 645b64fe21 DNF90 服务端与启动器完整源码(含 GM 工具功能增强)
服务端(Go):
- GM 塞背包/带属性装备发放:在线角色推送 op14 增量物品行,背包实时刷新,无需回角色选择界面
- GM 改金币/改等级:去掉在线拒绝,落库后推送 op14 钱包/op37 等级状态,在线实时刷新
- 等级端点统一切换到新版 GMSetCharacterLevel(自带在线刷新)
- 无限/锁死疲劳模式 + 燃烧疲劳:每房间消耗 2 点、打怪与通关经验双倍
- 燃烧疲劳开关时给所有在线角色推送系统提示(op12 mode 0)
- 深渊史诗掉率:GM 全局倍率 + 城镇增益药剂窗口倍率,真实接入掉落结算

启动器(Python/JS):
- 标题栏自绘、窗口 1204x717、禁止拖拽改大小、仅最小化/关闭
- GM 工具:疲劳与燃烧、深渊史诗掉率、拍卖行上架(单一定价对齐)
- 拍卖行上架前端对齐服务端单一价格语义,修复 400 报错
2026-11-04 14:31:55 +08:00

250 lines
9.2 KiB
Go

package dnfbridge
import (
dnfrepo "longheng.io/server/internal/modules/dnf/repository"
"strconv"
)
func (r *csharpLegacyUserInfoReader) build109() []byte {
row := r.one("legacy_character_userinfo109_state", []string{"value0", "value1", "value2", "value3"})
var w packetWriter
for idx := 0; idx < 4; idx++ {
w.writeUint32(rowU32(row, "value"+strconv.Itoa(idx), 0))
}
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build118() []byte {
rows := r.rows("legacy_character_userinfo118_rows",
[]string{"key", "flag_a", "value_a", "value_b", "value_c", "value_d", "flag_b"},
[]string{"sort_order"})
var w packetWriter
w.writeUint32(uint32(len(rows)))
for _, row := range rows {
w.writeUint32(rowU32(row, "key", 0))
w.writeByte(rowU8(row, "flag_a", 0))
w.writeUint32(rowU32(row, "value_a", 0))
w.writeUint32(rowU32(row, "value_b", 0))
w.writeUint32(rowU32(row, "value_c", 0))
w.writeUint32(rowU32(row, "value_d", 0))
w.writeByte(rowU8(row, "flag_b", 0))
}
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build11D() []byte {
row := r.one("legacy_character_userinfo11d_state", []string{"mode", "byte_a", "value_a", "byte_b", "word"})
mode := rowU8(row, "mode", 0)
var w packetWriter
w.writeByte(mode)
switch mode {
case 0:
w.writeByte(rowU8(row, "byte_a", 0))
w.writeUint32(rowU32(row, "value_a", 0))
case 1:
w.writeByte(rowU8(row, "byte_a", 0))
w.writeUint32(rowU32(row, "value_a", 0))
w.writeByte(rowU8(row, "byte_b", 0))
w.writeUint16(rowU16(row, "word", 0))
}
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build126() []byte {
row := r.one("legacy_character_userinfo126_state", []string{"text", "value_a", "value_b", "word_a", "word_b"})
var w packetWriter
writeWideNullTerminatedString(&w, rowString(row, "text", ""))
w.writeUint32(rowU32(row, "value_a", 0))
w.writeUint32(rowU32(row, "value_b", 0))
w.writeUint16(rowU16(row, "word_a", 0))
w.writeUint16(rowU16(row, "word_b", 0))
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build154() []byte {
row := r.one("legacy_character_userinfo154_state", []string{"key_a", "slot_or_value_a", "key_b", "delta"})
var w packetWriter
w.writeUint32(rowU32(row, "key_a", 0))
w.writeUint16(rowU16(row, "slot_or_value_a", 0))
w.writeUint32(rowU32(row, "key_b", 0))
w.writeUint16(rowU16(row, "delta", 0))
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build159() []byte {
rows := r.rows("legacy_character_userinfo159_rows", []string{"slot", "value"}, []string{"sort_order"})
rows = limitLegacyRowsU8(rows)
var w packetWriter
w.writeByte(byte(len(rows)))
for _, row := range rows {
w.writeByte(rowU8(row, "slot", 0xff))
w.writeUint32(rowU32(row, "value", 0))
}
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build17C() []byte {
control := r.one("legacy_character_userinfo17c_control", []string{"header_flag"})
rows := r.rows("legacy_character_userinfo17c_rows",
[]string{"selector", "item_or_key", "value"},
[]string{"sort_order"})
var w packetWriter
w.writeByte(rowU8(control, "header_flag", 0))
w.writeUint16(uint16(len(rows)))
for _, row := range rows {
w.writeUint16(rowU16(row, "selector", 0))
w.writeUint32(rowU32(row, "item_or_key", 0))
w.writeUint32(rowU32(row, "value", 0))
}
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build182() []byte {
control := r.one("legacy_character_userinfo182_control", []string{"actor_key", "header_flag", "outer_count"})
groupRows := r.rows("legacy_character_userinfo182_groups",
[]string{"phase", "group_index", "group_flag"},
[]string{"phase", "group_index"})
firstRows := r.rows("legacy_character_userinfo182_first_rows",
[]string{"group_index", "sort_order", "row_state"},
[]string{"group_index", "sort_order"})
firstValues := r.rows("legacy_character_userinfo182_first_values",
[]string{"group_index", "row_sort_order", "value_index", "value", "word"},
[]string{"group_index", "row_sort_order", "value_index"})
secondValues := r.rows("legacy_character_userinfo182_second_values",
[]string{"group_index", "value_index", "word", "value", "flag_a", "flag_b"},
[]string{"group_index", "value_index"})
groups := map[string]dnfrepo.LegacyUserInfoRow{}
for _, row := range groupRows {
groups[legacyGroupKey(rowInt(row, "phase", 0), rowInt(row, "group_index", 0))] = row
}
firstByGroup := map[int][]dnfrepo.LegacyUserInfoRow{}
for _, row := range firstRows {
group := rowInt(row, "group_index", 0)
firstByGroup[group] = append(firstByGroup[group], row)
}
firstValueByKey := map[string]dnfrepo.LegacyUserInfoRow{}
for _, row := range firstValues {
firstValueByKey[legacyGroupKey(rowInt(row, "group_index", 0), rowInt(row, "row_sort_order", 0), rowInt(row, "value_index", 0))] = row
}
secondValueByKey := map[string]dnfrepo.LegacyUserInfoRow{}
for _, row := range secondValues {
secondValueByKey[legacyGroupKey(rowInt(row, "group_index", 0), rowInt(row, "value_index", 0))] = row
}
outerCount := int(rowU8(control, "outer_count", 0))
var w packetWriter
w.writeUint32(rowU32(control, "actor_key", 0))
w.writeByte(rowU8(control, "header_flag", 0))
w.writeByte(byte(outerCount))
for groupIndex := 0; groupIndex < 4; groupIndex++ {
group := groups[legacyGroupKey(0, groupIndex)]
rows := limitLegacyRowsU8(firstByGroup[groupIndex])
w.writeByte(rowU8(group, "group_flag", 0))
w.writeByte(byte(len(rows)))
for _, row := range rows {
sortOrder := rowInt(row, "sort_order", 0)
w.writeByte(rowU8(row, "row_state", 0))
for valueIndex := 0; valueIndex < outerCount; valueIndex++ {
value := firstValueByKey[legacyGroupKey(groupIndex, sortOrder, valueIndex)]
w.writeUint32(rowU32(value, "value", 0))
w.writeUint16(rowU16(value, "word", 0))
}
}
}
for groupIndex := 0; groupIndex < 4; groupIndex++ {
group := groups[legacyGroupKey(1, groupIndex)]
w.writeByte(rowU8(group, "group_flag", 0))
for valueIndex := 0; valueIndex < outerCount; valueIndex++ {
value := secondValueByKey[legacyGroupKey(groupIndex, valueIndex)]
w.writeUint16(rowU16(value, "word", 0))
w.writeUint32(rowU32(value, "value", 0))
w.writeByte(rowU8(value, "flag_a", 0))
w.writeByte(rowU8(value, "flag_b", 0))
}
}
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build183() []byte {
control := r.one("legacy_character_userinfo183_control", []string{"header_a", "header_b", "header_value", "global_flag", "mode", "extra_value", "tail_flag"})
var w packetWriter
w.writeByte(rowU8(control, "header_a", 0))
w.writeByte(rowU8(control, "header_b", 0))
w.writeUint32(rowU32(control, "header_value", 0))
w.writeByte(rowU8(control, "global_flag", 0))
mode := rowU8(control, "mode", 0)
w.writeByte(mode)
if mode != 1 && mode != 2 {
return w.bytes()
}
primary := limitLegacyRowsU8(r.rows("legacy_character_userinfo183_primary_rows",
[]string{"word0", "key_or_value", "word1", "word2", "flag0", "flag1", "bool_flag", "flag2"},
[]string{"sort_order"}))
secondary := limitLegacyRowsU8(r.rows("legacy_character_userinfo183_secondary_rows",
[]string{"row_type", "value0", "value1", "value2", "word0", "flag", "word1", "word2"},
[]string{"sort_order"}))
w.writeUint32(rowU32(control, "extra_value", 0))
w.writeByte(byte(len(primary)))
for _, row := range primary {
w.writeUint16(rowU16(row, "word0", 0))
w.writeUint32(rowU32(row, "key_or_value", 0))
w.writeUint16(rowU16(row, "word1", 0))
w.writeUint16(rowU16(row, "word2", 0))
w.writeByte(rowU8(row, "flag0", 0))
w.writeByte(rowU8(row, "flag1", 0))
w.writeByte(rowU8(row, "bool_flag", 0))
w.writeByte(rowU8(row, "flag2", 0))
}
w.writeByte(byte(len(secondary)))
for _, row := range secondary {
w.writeByte(rowU8(row, "row_type", 0))
w.writeUint32(rowU32(row, "value0", 0))
w.writeUint32(rowU32(row, "value1", 0))
w.writeUint32(rowU32(row, "value2", 0))
w.writeUint16(rowU16(row, "word0", 0))
w.writeByte(rowU8(row, "flag", 0))
w.writeUint16(rowU16(row, "word1", 0))
w.writeUint16(rowU16(row, "word2", 0))
}
w.writeByte(rowU8(control, "tail_flag", 0))
return w.bytes()
}
func (r *csharpLegacyUserInfoReader) build184() []byte {
control := r.one("legacy_character_userinfo184_control", []string{"header", "value"})
first := limitLegacyRowsU8(r.rows("legacy_character_userinfo184_first_rows",
[]string{"word", "value_a", "value_b", "value_c", "flag_a", "flag_b"},
[]string{"sort_order"}))
second := limitLegacyRowsU8(r.rows("legacy_character_userinfo184_second_rows",
[]string{"value_a", "value_b", "word"},
[]string{"sort_order"}))
third := limitLegacyRowsU8(r.rows("legacy_character_userinfo184_third_rows",
[]string{"value_a", "value_b", "word"},
[]string{"sort_order"}))
var w packetWriter
w.writeByte(rowU8(control, "header", 0))
w.writeUint32(rowU32(control, "value", 0))
w.writeByte(byte(len(first)))
for _, row := range first {
w.writeUint16(rowU16(row, "word", 0))
w.writeUint32(rowU32(row, "value_a", 0))
w.writeUint32(rowU32(row, "value_b", 0))
w.writeUint16(rowU16(row, "value_c", 0))
w.writeByte(rowU8(row, "flag_a", 0))
w.writeByte(rowU8(row, "flag_b", 0))
}
write184ValueRows(&w, second)
write184ValueRows(&w, third)
return w.bytes()
}
func write184ValueRows(w *packetWriter, rows []dnfrepo.LegacyUserInfoRow) {
w.writeByte(byte(len(rows)))
for _, row := range rows {
w.writeUint32(rowU32(row, "value_a", 0))
w.writeUint32(rowU32(row, "value_b", 0))
w.writeUint16(rowU16(row, "word", 0))
}
}