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,249 @@
|
||||
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))
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user