diff --git a/Makefile b/Makefile index 7cd30d706..c0d93ab48 100644 --- a/Makefile +++ b/Makefile @@ -135,7 +135,7 @@ build/phoenixbuilder: build/ ${SRCS_GO} GODEBUG=madvdontneed=1 CGO_CFLAGS=${CGO_DEF} CGO_ENABLED=1 go build -tags "${APPEND_GO_TAGS}" -trimpath -ldflags "-s -w" -o $@ build/phoenixbuilder-no-readline: build/ ${SRCS_GO} cd depends/stub&&make clean&&cd - - GODEBUG=madvdontneed=1 CGO_CFLAGS=${CGO_DEF} CGO_ENABLED=1 go build -tags "no_readline" -tags "${APPEND_GO_TAGS}" -trimpath -ldflags "-s -w" -o $@ + GODEBUG=madvdontneed=1 CGO_CFLAGS=${CGO_DEF} CGO_ENABLED=1 go build -tags "no_readline ${APPEND_GO_TAGS}" -trimpath -ldflags "-s -w" -o $@ build/phoenixbuilder-with-symbols: build/ ${SRCS_GO} cd depends/stub&&make clean&&cd - GODEBUG=madvdontneed=1 CGO_CFLAGS=${CGO_DEF} CGO_ENABLED=1 go build -tags "${APPEND_GO_TAGS}" -trimpath -o $@ diff --git a/fastbuilder/bdump/blockNBT/CommandBlock/legacyMethod.go b/fastbuilder/bdump/blockNBT/CommandBlock/legacyMethod.go index a61ce7169..e41c11fe4 100644 --- a/fastbuilder/bdump/blockNBT/CommandBlock/legacyMethod.go +++ b/fastbuilder/bdump/blockNBT/CommandBlock/legacyMethod.go @@ -26,17 +26,18 @@ func (c *CommandBlock) PlaceCommandBlockWithLegacyMethod(block *types.Module, cf } else if block.CommandBlockData.Mode == packet.CommandBlockRepeating { blockName = "repeating_command_block" } - block.Block.Name = &blockName - c.BlockEntityDatas.Block.Name = blockName - // 确定命令方块的类型 if block.Block == nil { + block.Block = &types.Block{} + block.Block.Name = &blockName err := c.WriteDatas(false) if err != nil { return fmt.Errorf("PlaceCommandBlockWithLegacyMethod: %v", err) } return nil } - // 如果是 operation 26 - SetCommandBlockData + block.Block.Name = &blockName + c.BlockEntityDatas.Block.Name = blockName + // 确定命令方块的类型 & 如果是 operation 26 - SetCommandBlockData request := commands_generator.SetBlockRequest(block, cfg) if c.BlockEntityDatas.Datas.FastMode { err := c.BlockEntityDatas.API.SendSettingsCommand(request, true) diff --git a/fastbuilder/bdump/command/set_command_block_data.go b/fastbuilder/bdump/command/set_command_block_data.go index deef06cd6..b78550c75 100644 --- a/fastbuilder/bdump/command/set_command_block_data.go +++ b/fastbuilder/bdump/command/set_command_block_data.go @@ -61,6 +61,7 @@ func (cmd *SetCommandBlockData) Marshal(writer io.Writer) error { } func (cmd *SetCommandBlockData) Unmarshal(reader io.Reader) error { + cmd.CommandBlockData = &types.CommandBlockData{} buf:=make([]byte, 4) _, err:=io.ReadAtLeast(reader, buf, 4) if err!=nil { diff --git a/fastbuilder/core/core.go b/fastbuilder/core/core.go index 2b605d5e2..31302bbf6 100644 --- a/fastbuilder/core/core.go +++ b/fastbuilder/core/core.go @@ -2,6 +2,8 @@ package core import ( "bufio" + "bytes" + "encoding/binary" "encoding/json" "fmt" "os" @@ -193,6 +195,35 @@ func InitClient(env *environment.PBEnvironment) { conn.WritePacket(&packet.ClientCacheStatus{ Enabled: false, }) + runtimeid := fmt.Sprintf("%d", conn.GameData().EntityUniqueID) + { + conn.WritePacket(&packet.PyRpc{ + Content: []byte{0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x93, 0xc4, 0xc, 0x53, 0x79, 0x6e, 0x63, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x91, 0x90, 0xc0}, + }) + conn.WritePacket(&packet.PyRpc{ + Content: []byte{0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x93, 0xc4, 0xf, 0x53, 0x79, 0x6e, 0x63, 0x56, 0x69, 0x70, 0x53, 0x6b, 0x69, 0x6e, 0x55, 0x75, 0x69, 0x64, 0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x91, 0xc0, 0xc0}, + }) + conn.WritePacket(&packet.PyRpc{ + Content: []byte{0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x93, 0xc4, 0x1f, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x41, 0x64, 0x64, 0x6f, 0x6e, 0x73, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x65, 0x64, 0x46, 0x72, 0x6f, 0x6d, 0x47, 0x61, 0x63, 0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x90, 0xc0}, + }) + conn.WritePacket(&packet.PyRpc{ + Content: bytes.Join([][]byte{[]byte{0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x93, 0xc4, 0xb, 0x4d, 0x6f, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x32, 0x53, 0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x94, 0xc4, 0x9, 0x4d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0xc4, 0x6, 0x70, 0x72, 0x65, 0x73, 0x65, 0x74, 0xc4, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x65, 0x64, 0x49, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x81, 0xc4, 0x8, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0xc4}, + []byte{byte(len(runtimeid))}, + []byte(runtimeid), + []byte{0xc0}, + }, []byte{}), + }) + conn.WritePacket(&packet.PyRpc{ + Content: []byte{0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x93, 0xc4, 0x19, 0x61, 0x72, 0x65, 0x6e, 0x61, 0x47, 0x61, 0x6d, 0x65, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x4c, 0x6f, 0x61, 0x64, 0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x90, 0xc0}, + }) + conn.WritePacket(&packet.PyRpc{ + Content: bytes.Join([][]byte{[]byte{0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x93, 0xc4, 0xb, 0x4d, 0x6f, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x43, 0x32, 0x53, 0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x94, 0xc4, 0x9, 0x4d, 0x69, 0x6e, 0x65, 0x63, 0x72, 0x61, 0x66, 0x74, 0xc4, 0xe, 0x76, 0x69, 0x70, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0xc4, 0xc, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x55, 0x69, 0x49, 0x6e, 0x69, 0x74, 0xc4}, + []byte{byte(len(runtimeid))}, + []byte(runtimeid), + []byte{0xc0}, + }, []byte{}), + }) + } env.UQHolder = uqHolder.NewUQHolder(conn.GameData().EntityRuntimeID) env.UQHolder.(*uqHolder.UQHolder).UpdateFromConn(conn) env.UQHolder.(*uqHolder.UQHolder).CurrentTick = 0 @@ -336,6 +367,7 @@ func EnterWorkerThread(env *environment.PBEnvironment, breaker chan struct{}) { chunkAssembler.CreateRequestScheduler(func(pk *packet.SubChunkRequest) { conn.WritePacket(pk) }) + getchecknum_everPassed := false // currentChunkConstructor := &world_provider.ChunkConstructor{} for { if breaker != nil { @@ -352,6 +384,80 @@ func EnterWorkerThread(env *environment.PBEnvironment, breaker chan struct{}) { env.NewUQHolder.(*blockNBT_API.PacketHandleResult).HandlePacket(&pk) // for blockNBT + { + p, ok := pk.(*packet.PyRpc) + if ok { + if strings.Contains(string(p.Content), "GetStartType") { + // 2021-12-22 10:51~11:55 + // 2023-05-30 + // Thank netease for wasting my time again ;) + //fmt.Printf("%X\n", p.Content) + encData := p.Content[len(p.Content)-163 : len(p.Content)-1] + //fmt.Printf("%s\n", p.Content) + //fmt.Printf("%s\n", encData) + //fmt.Printf("%s\n", env.Uid) + client := env.FBAuthClient.(*fbauth.Client) + response := client.TransferData(string(encData), fmt.Sprintf("%s", env.Uid)) + //fmt.Printf("%s\n", response) + conn.WritePacket(&packet.PyRpc{ + Content: bytes.Join([][]byte{[]byte{0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x93, 0xc4, 0xc, 0x53, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x91, 0xc4}, + []byte{byte(len(response))}, + []byte(response), + []byte{0xc0}, + }, []byte{}), + }) + //fmt.Printf("%s\n", response) + } else if strings.Contains(string(p.Content), "GetMCPCheckNum") { + // This shit sucks, so as netease. + if getchecknum_everPassed { + continue + } + //fmt.Printf("%X", p.Content) + //fmt.Printf("%s\n", p.Content) + firstArgLenB := p.Content[19:21] + firstArgLen := binary.BigEndian.Uint16(firstArgLenB) + firstArg := string(p.Content[21 : 21+firstArgLen]) + secondArgLen := uint16(p.Content[23+firstArgLen]) + secondArg := string(p.Content[24+firstArgLen : 24+firstArgLen+secondArgLen]) + //fmt.Printf("%s\n", secondArg) + //valM,_:=getUserInputMD5() + //valS,_:=getUserInputMD5() + //valM := utils.GetMD5(fmt.Sprintf("qhk+um%ssvdrx,9=>", secondArg)) + //valS := utils.GetMD5(fmt.Sprintf("%s%s", valM[16:], valM[:16])) + //fmt.Printf("%s\n",valM) + client := env.FBAuthClient.(*fbauth.Client) + valM, valS := client.TransferCheckNum(firstArg, secondArg) + /*conn.WritePacket(&packet.PyRpc{ + Content: bytes.Join([][]byte{[]byte{0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x93, 0xc4, 0xe, 0x53, 0x65, 0x74, 0x4d, 0x43, 0x50, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x82, 0xc4, 0x8, 0x5f, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x5f, 0xc4, 0x5, 0x74, 0x75, 0x70, 0x6c, 0x65, 0xc4, 0x5, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x91, 0xc4, 0x20}, + []byte(valM), + []byte{0xc0}, + }, []byte{}), + })*/ + conn.WritePacket(&packet.PyRpc{ + Content: bytes.Join([][]byte{[]byte{0x93, 0xc4, 0x0e}, []byte("SetMCPCheckNum"), []byte{0x91, 0x93, 0xc4, 0x20}, + []byte(valM), + []byte{0xc4, 0x20}, + []byte(valS), + []byte{0xc2}, + []byte{0xC0}, + }, []byte{}), + }) + getchecknum_everPassed = true + /*go func() { + time.Sleep(3*time.Second) + ud, _ := uuid.NewUUID() + chann := make(chan *packet.CommandOutput) + commandSender.UUIDMap.Store(ud.String(), chann) + commandSender.SendCommand("list", ud) + resp := <-chann + fmt.Printf("%+v\n", resp) + } ()*/ + } else { + //fmt.Printf("PyRpc! %s\n", p.Content) + } + } + } + if env.OmegaAdaptorHolder != nil { env.OmegaAdaptorHolder.(*embed.EmbeddedAdaptor).FeedPacketAndByte(pk, data) continue @@ -552,3 +658,13 @@ func Fatal() { } os.Exit(0) } + +func getUserInputMD5() (string, error) { + reader := bufio.NewReader(os.Stdin) + fmt.Printf("MD5: ") + code, err := reader.ReadString('\n') + if err != nil { + return "", err + } + return strings.TrimRight(code, "\r\n"), err +} diff --git a/fastbuilder/cv4/auth/client.go b/fastbuilder/cv4/auth/client.go index b7d3c34fe..a2b936db9 100644 --- a/fastbuilder/cv4/auth/client.go +++ b/fastbuilder/cv4/auth/client.go @@ -296,6 +296,33 @@ func (client *Client) TransferData(content string, uid string) string { return data } +type FNumRequest struct { + Action string `json:"action"` + First string `json:"1st"` + Second string `json:"2nd"` +} + +func (client *Client) TransferCheckNum(first string, second string) (string, string) { + rspreq := &FNumRequest{ + Action: "phoenix::transfer-check-num", + First: first, + Second: second, + } + msg, err := json.Marshal(rspreq) + if err != nil { + panic("Failed to encode json") + } + client.SendMessage(msg) + resp, _ := <-client.serverResponse + code, _ := resp["code"].(float64) + if code != 0 { + panic("Failed to transfer checknum") + } + valM, _ := resp["valM"].(string) + valS, _ := resp["valS"].(string) + return valM, valS +} + type WorldChatRequest struct { Category string `json:"category"` Action string `json:"action"` diff --git a/fastbuilder/i18n/tg_JP.go b/fastbuilder/i18n/tg_JP.go new file mode 100644 index 000000000..0575ade07 --- /dev/null +++ b/fastbuilder/i18n/tg_JP.go @@ -0,0 +1,140 @@ +package I18n + +var I18nDict_tg_JP map[uint16]string = map[uint16]string{ + ACME_FailedToGetCommand: "ACME コマンドの解析に失敗した。", + ACME_FailedToSeek: "ファイルのシークに失敗したんで、この ACME ファイルが無効かもしれん。", + ACME_StructureErrorNotice: "ファイルの内容が無効だ。", + ACME_UnknownCommand: "このファイルには未知な ACME コマンドがある。", + Auth_BackendError: "バックエンドエラー", + Auth_FailedToRequestEntry: "サーバーの入り方が貰えないんで、サーバーのレベルレギュレーションを締めて、パスワードをチェックしてね。", + Auth_HelperNotCreated: "ヘルパーユーザーがまだないんで、FastBuilder ユーザーセンターで作ってね。", + Auth_InvalidFBVersion: "このバーションはアウトデートなので更新して。", + Auth_InvalidHelperUsername: "ヘルパーユーザーがまだ名付かれていないんで、FastBuilder ユーザーセンターで名付けてください。", + Auth_InvalidToken: "ログイントークンが無効。", + Auth_InvalidUser: "ユーザー無効。", + Auth_ServerNotFound: "指定されたサーバーが見つかれん。開放状態を確認したあとまたやってみて。", + Auth_UnauthorizedRentalServerNumber: "未認証のサーバー番号だった。FastBuilder ユーザーセンターでアドしてください。", + Auth_UserCombined: "指定されたユーザーはもうほかのユーザーに合体されたんで新アカウントでログインしてください。", + Auth_FailedToRequestEntry_TryAgain: "サーバーインフォの取得に失敗した。あとでもう一度試してね。", + BDump_Author: "作者", + BDump_EarlyEOFRightWhenOpening: "ファイルエンドが来るのは早すぎたんで読めんぞい。それがもうこわれたかも。", + BDump_FailedToGetCmd1: "cmd[pos:0] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetCmd2: "cmd[pos1] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetCmd4: "cmd[pos2] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetCmd6: "cmd[pos3] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetCmd7_0: "cmd[pos4] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetCmd7_1: "cmd[pos5] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetCmd10: "cmd[pos6] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetCmd11: "cmd[pos7] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetCmd12: "cmd[pos8] のアーギュメントが読めん。ファイルがもう壊れたかも。", + BDump_FailedToGetConstructCmd: "BDump コマンドが読めん。ファイルがもう壊れたかも。", + BDump_FailedToReadAuthorInfo: "作者情報が読めない。ファイルがもう壊れたかも。", + BDump_FileNotSigned: "このファイルはサインされてない。", + BDump_FileSigned: "このファイルはサインされた。サイン元: %s", + BDump_NotBDX_Invheader: "このファイルは bdx ファイルじゃないんだ。(無効なヘッダー)", + BDump_NotBDX_Invinnerheader: "ファイルが bdx ファイルじゃない。 (無効な内部ヘッダー)", + BDump_SignedVerifying: "このファイルはサインされた、それをいまチェックしてる...", + BDump_VerificationFailedFor: "%v のためにファイルのサインをチェック出来ん。", + BDump_Warn_Reserved: "警告: BDump/Import: 保留されたコマンドがいま使用された\n", + CommandNotFound: "未知なコマンド。", + ConnectionEstablished: "サーバーへ接続した。", + Copyright_Notice_Bouldev: "Copyright (c) FastBuilder DevGroup, Bouldev 2022", + Copyright_Notice_Contrib: "コントリビュータ: Ruphane, CAIMEO, CMA2401PT", + Crashed_No_Connection: "長い時間をかけても接続できなかった。", + Crashed_OS_Windows: "ENTER を押して終了。", + Crashed_StackDump_And_Error: "スタックダンプ (Stack dump) が上に見える。エラーは: ", + Crashed_Tip: "ヤバいぞい!FastBuilder Phoenix がクラッシューしたよ!", + CurrentDefaultDelayMode: "今のデフォルトディレーモード", + CurrentTasks: "進行中のタスク:", + DelayModeSet: "ディレーモードが設定された", + DelayModeSet_DelayAuto: "ディレーを自動に %d に設定した。", + DelayModeSet_ThresholdAuto: "ディレーのしきい値を自動に %d に設定した.", + DelaySet: "ディレーが設定された.", + DelaySetUnavailableUnderNoneMode: "[delay set] コマンドがディレーモードが none の時に使えない。", + DelayThreshold_OnlyDiscrete: "ディレーのしきい値がディレーモードが discrete の時だけに使える。", + DelayThreshold_Set: "ディレーのしきい値を %d にした。", + ERRORStr: "エラー", + EnterPasswordForFBUC: "FastBuilder ユーザーセンターのパスワードは: ", + Enter_FBUC_Username: "FastBuilder ユーザーセンターのログイン名は: ", + Enter_Rental_Server_Code: "サーバー番号は: ", + Enter_Rental_Server_Password: "サーバーのパスワードはなに? (パスワードがなければ直接 ENTER をおす。入力した内容がみえん): ", + ErrorIgnored: "エラーを無視した。", + Error_MapY_Exceed: "3DMap で, MapY が必ず [20~255] の範囲にしてください (入力した方 = %v)", + FBUC_LoginFailed: "FastBuilder ユーザーセンターのログイン名やパスワードが間違えた。", + FBUC_Token_ErrOnCreate: "トークンファイルが作成できん: ", + FBUC_Token_ErrOnGen: "臨時トークンを作成出来なかった", + FBUC_Token_ErrOnRemove: "トークンファイルを削除できなかった: %v", + FBUC_Token_ErrOnSave: "トークンを保存できなかった: ", + FileCorruptedError: "ファイルが壊れた", + Get_Warning: "", + IgnoredStr: "無視した", + InvalidFileError: "無効なファイル。", + InvalidPosition: "働くポジションを取得できなかった。 (無視でOK)", + Lang_Config_ErrOnCreate: "言語設定ファイルを作成できなかった: %v", + Lang_Config_ErrOnSave: "言語設定を保存できなかった: %v", + LanguageName: "日本語(タメ語)", + LanguageUpdated: "言語設定を変更した。", + Logout_Done: "FastBuilder ユーザーセンターからログアウトした。", + Menu_BackButton: "< Back", // REMOVED FEATURES NO TRANSLATION + Menu_Cancel: "Cancel", // FOR THEM + Menu_CurrentPath: "Current path", + Menu_ExcludeCommandsOption: "Exclude Commands", + Menu_GetEndPos: "getEndPos", + Menu_GetPos: "getPos", + Menu_InvalidateCommandsOption: "Invalidate Commands", + Menu_Quit: "Quit Program", + Menu_StrictModeOption: "Strict Mode", + NotAnACMEFile: "このファイルは ACME ストラクチャーファイルじゃなかった。", + Notice_CheckUpdate: "更新を検査中、待っていてね...", + Notice_iSH_Location_Service: "iSH に居るんで、生きることを保持にはロケーションサービスが必要。位置情報が利用されんで、いつでもそれを締めてもいい。", + Notice_OK: "完成\n", + Notice_UpdateAvailable: "新しいバーション (%s) の PhoenixBuilder がリリースされた。\n", + Notice_UpdateNotice: "更新して。\n", + Notice_ZLIB_CVE: "今使われてる zlib のバーション (%s) は古すぎていくつかの CVE バルネラビリティーがもう確認された、それを更新した方がいい。", + Notify_NeedOp: "OP レベルが PhoenixBuilder の正常なかどうには必要。", + Notify_TurnOnCmdFeedBack: "PhoenixBuilder の正常な稼働には gamerule sendcommandfeedback を true にするのが必要なので、もう自動に gamerule sendcommandfeedback を true にさせたんで、必要があればそのうち書き直してね。", + Omega_WaitingForOP: "Omega System が OP レベルの取得を待っている...", + Omega_Enabled: "Omega System が使われてる!", + OpPrivilegeNotGrantedForOperation: "OP レベルが PhoenixBuilder の正常なかどうには必要なので、OP にしたらまた試して。", + Parsing_UnterminatedEscape: "終わらず escape", + Parsing_UnterminatedQuotedString: "終わらず quoted string", + PositionGot: "位置ゲット!", + PositionGot_End: "終点位置ゲット!", + PositionSet: "位置をセットした!", + PositionSet_End: "終点位置をセットした", + QuitCorrectly: "プログラムが正常に終了した。", + Sch_FailedToResolve: "ファイルを読めなかった", + SelectLanguageOnConsole: "コンソールで新言語を選べて。", + ServerCodeTrans: "サーバー", + SimpleParser_Int_ParsingFailed: "アーギュメント読み込み器: 整数アーギュメントを読めなかった。", + SimpleParser_InvEnum: "アーギュメント読み込み器: 予期せず選択肢、予期した選択肢は: %s.", + SimpleParser_Invalid_decider: "アーギュメント読み込み器: 無効な選択肢だった", + SimpleParser_Too_few_args: "アーギュメント読み込み器: アーギュメント少なさ過ぎる", + Special_Startup: "日本語(タメ語)を使ってる\n", + TaskCreated: "タスクを作った", + TaskDisplayModeSet: "タスク状態表示モードを %s にした.", + TaskFailedToParseCommand: "コマンド %v を読めなかった。", + TaskNotFoundMessage: "教えたタスク番号で進行してるタスクを見つかれんぞ。", + TaskPausedNotice: "[タスク %d] - 一時停止", + TaskResumedNotice: "[タスク %d] - 回復", + TaskStateLine: "ID %d - コマンドライン:\"%s\", 状態: %s, ディレー: %d, ディレーモード: %s, ディレーしきい値: %d", + TaskStoppedNotice: "[タスク %d] - 停止", + TaskTTeIuKoto: "タスク", + TaskTotalCount: "総計: %d", + TaskTypeCalculating: "計算中", + TaskTypeDied: "停止", + TaskTypePaused: "一時停止", + TaskTypeRunning: "進行中", + TaskTypeSpecialTaskBreaking: "スペシャルタスク:停止中", + TaskTypeSwitchedTo: "タスク作成タイプを %s にした", + TaskTypeUnknown: "未知", + Task_D_NothingGenerated: "[タスク %d] なにも建造されなかった", + Task_DelaySet: "[タスク %d] - ディレーを %d にした", + Task_ResumeBuildFrom: "ブロック数 %d から建造を再開する", + Task_SetDelay_Unavailable: "[setdelay] がディレーモードが none の時に使えん。", + Task_Summary_1: "[タスク %d] %v 影響されたブロック", + Task_Summary_2: "[タスク %d] %v 秒をかけた", + Task_Summary_3: "[タスク %d] 平均速度: %v ブロック/秒", + UnsupportedACMEVersion: "このバーションの ACME ストラクチャーファイルは支援されていない。バーション 1.2 だけが支援されてる。", + Warning_UserHomeDir: "警告 - ユーザーのホームフォルダーが見つかれん。homedir=\".\";にした。\n", +} diff --git a/minecraft/nbt/decode.go b/minecraft/nbt/decode.go index 297607717..16a553af8 100644 --- a/minecraft/nbt/decode.go +++ b/minecraft/nbt/decode.go @@ -441,9 +441,11 @@ func (d *Decoder) tag() (tagType byte, tagName string, err error) { if d.depth >= maximumNestingDepth { return 0, "", MaximumDepthReachedError{} } + /* if d.r.off >= maximumNetworkOffset && d.Encoding == NetworkLittleEndian { return 0, "", MaximumBytesReadError{} } + */ tagType, err = d.r.ReadByte() if err != nil { return 0, "", BufferOverrunError{Op: "ReadTag"} diff --git a/minecraft/protocol/packet/id.go b/minecraft/protocol/packet/id.go index 8e4accba0..1e7636fe3 100644 --- a/minecraft/protocol/packet/id.go +++ b/minecraft/protocol/packet/id.go @@ -183,4 +183,5 @@ const ( IDDimensionData IDAgentAction IDChangeMobProperty + IDPyRpc = 0xC8 ) diff --git a/minecraft/protocol/packet/pool.go b/minecraft/protocol/packet/pool.go index e91c0fc3e..74d939f2e 100644 --- a/minecraft/protocol/packet/pool.go +++ b/minecraft/protocol/packet/pool.go @@ -206,6 +206,7 @@ func init() { IDDimensionData: func() Packet { return &DimensionData{} }, IDAgentAction: func() Packet { return &AgentAction{} }, IDChangeMobProperty: func() Packet { return &ChangeMobProperty{} }, + IDPyRpc: func() Packet { return &PyRpc{} }, } for id, pk := range packets { Register(id, pk) diff --git a/minecraft/protocol/packet/py_rpc.go b/minecraft/protocol/packet/py_rpc.go new file mode 100644 index 000000000..031673214 --- /dev/null +++ b/minecraft/protocol/packet/py_rpc.go @@ -0,0 +1,47 @@ +package packet + +import ( + //"bytes" + //"fmt" + "phoenixbuilder/minecraft/protocol" +) + + +type PyRpc struct { + Content []byte +} + +// ID ... +func (*PyRpc) ID() uint32 { + return IDPyRpc +} + +// Marshal ... +func (pk *PyRpc) Marshal(w *protocol.Writer) { + w.ByteSlice(&pk.Content) + w.Bytes(&[]byte{0xae,0x23,0xdb,0x05}) + //fmt.Printf("%d\n",len(pk.Content)) + //fmt.Printf("%X\n",buf.Bytes()) + //_ = protocol.WriteByteSlice(buf, pk.Content) + //_ = protocol.WriteVaruint32(buf, pk.DisallowBatching) + //buf.Write([]byte{0xae,0x23,0xdb,0x05}) + //fmt.Printf("%X\n\n",buf.Bytes()) + //var outuint32 uint32 + //protocol.Varuint32(bytes.NewBuffer([]byte{0xae,0x23,0xdb,0x05}),&outuint32) + //fmt.Printf("%d\n",outuint32) + +} + +// Unmarshal ... +func (pk *PyRpc) Unmarshal(r *protocol.Reader) { + r.ByteSlice(&pk.Content) + /*var bt byte + var bt2 byte + var bt3 byte + var bt4 byte + r.Uint8(&bt) + r.Uint8(&bt2) + r.Uint8(&bt3) + r.Uint8(&bt4) + fmt.Printf("Addi:%X %X %X %X %X\n", bt, bt2, bt3, bt4)*/ +} \ No newline at end of file diff --git a/version b/version index 831446cbd..ce7f2b425 100644 --- a/version +++ b/version @@ -1 +1 @@ -5.1.0 +5.2.2