Skip to content

Commit f6d7533

Browse files
authored
Refactor synthesis handling for fishing rods
1 parent d77b8cf commit f6d7533

File tree

1 file changed

+101
-134
lines changed

1 file changed

+101
-134
lines changed

plugin/mcfish/pole.go

Lines changed: 101 additions & 134 deletions
Original file line numberDiff line numberDiff line change
@@ -342,137 +342,112 @@ func init() {
342342
}
343343
ctx.SendChain(message.Text("附魔成功,", book, "等级提高至", enchantLevel[number]))
344344
})
345-
engine.OnRegex(`^合成(.+竿|三叉戟)$`, getdb).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
346-
uid := ctx.Event.UserID
347-
thingList := []string{"木竿", "铁竿", "金竿", "钻石竿", "下界合金竿", "三叉戟"}
348-
thingName := ctx.State["regex_matched"].([]string)[1]
349-
indexOfMaterial := -1
350-
for i, name := range thingList {
351-
if thingName == name {
352-
indexOfMaterial = (i - 1)
353-
break
354-
}
355-
}
356-
if indexOfMaterial < 0 {
357-
return
358-
}
359-
articles, err := dbdata.getUserThingInfo(uid, thingList[indexOfMaterial])
360-
if err != nil {
361-
ctx.SendChain(message.Text("[ERROR at pole.go.10]:", err))
362-
return
363-
}
364-
maxCount := len(articles)
365-
if maxCount < 3 {
366-
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("你的合成材料不足"))
367-
return
368-
}
369-
poles := make([]equip, 0, maxCount)
370-
for _, info := range articles {
371-
poleInfo := strings.Split(info.Other, "/")
372-
durable, _ := strconv.Atoi(poleInfo[0])
373-
maintenance, _ := strconv.Atoi(poleInfo[1])
374-
induceLevel, _ := strconv.Atoi(poleInfo[2])
375-
favorLevel, _ := strconv.Atoi(poleInfo[3])
376-
poles = append(poles, equip{
377-
ID: uid,
378-
Equip: info.Name,
379-
Durable: durable,
380-
Maintenance: maintenance,
381-
Induce: induceLevel,
382-
Favor: favorLevel,
383-
})
384-
}
385-
list := []int{0, 1, 2}
386-
check := false
387-
if len(articles) > 3 {
388-
msg := make(message.Message, 0, 3+len(articles))
389-
msg = append(msg, message.Text("找到以下鱼竿:\n"))
390-
for i, info := range poles {
391-
msg = append(msg, message.Text("[", i, "] ", info.Equip, " : 耐", info.Durable, "/修", info.Maintenance,
392-
"/诱", enchantLevel[info.Induce], "/眷顾", enchantLevel[info.Favor], "\n"))
393-
}
394-
msg = append(msg, message.Text("————————\n"))
395-
msg = append(msg, message.Text("- 输入3个序号进行合成(用空格分割)\n"))
396-
msg = append(msg, message.Text("- 输入“取消”,终止本次合成\n"))
397-
msg = append(msg, message.Text("- 输入“梭哈“,合成所有鱼竿"))
398-
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, msg...))
399-
// 等待用户下一步选择
400-
recv, cancel := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`^(梭哈|取消|\d+ \d+ \d+)$`), zero.CheckUser(ctx.Event.UserID)).Repeat()
401-
defer cancel()
402-
for {
403-
select {
404-
case <-time.After(time.Second * 120):
405-
ctx.Send(
406-
message.ReplyWithMessage(ctx.Event.MessageID,
407-
message.Text("等待超时,取消合成"),
408-
),
409-
)
410-
return
411-
case e := <-recv:
412-
nextcmd := e.Event.Message.String()
413-
if nextcmd == "取消" {
414-
ctx.Send(
415-
message.ReplyWithMessage(ctx.Event.MessageID,
416-
message.Text("已取消合成"),
417-
),
418-
)
419-
return
420-
}
421-
if nextcmd == "梭哈" {
422-
// len(list)取3的倍数,表示能够用于合成鱼竿的最大数量,note:此处未对article.Number>1的情况做处理
423-
for i := 3; i < (len(articles)/3)*3; i++ {
424-
list = append(list, i)
425-
}
426-
check = true
427-
break
428-
}
429-
chooseList := strings.Split(nextcmd, " ")
430-
first, err := strconv.Atoi(chooseList[0])
431-
if err != nil {
432-
ctx.SendChain(message.Text("[ERROR at pole.go.11.1]:", err))
433-
return
434-
}
435-
second, err := strconv.Atoi(chooseList[1])
436-
if err != nil {
437-
ctx.SendChain(message.Text("[ERROR at pole.go.11.2]:", err))
438-
return
439-
}
440-
third, err := strconv.Atoi(chooseList[2])
441-
if err != nil {
442-
ctx.SendChain(message.Text("[ERROR at pole.go.11.3]:", err))
443-
return
444-
}
445-
list = []int{first, second, third}
446-
if first == second || first == third || second == third {
447-
ctx.SendChain(message.At(ctx.Event.UserID), message.Text("[0]请输入正确的序号\n", list))
448-
continue
449-
}
450-
if first >= maxCount || second >= maxCount || third >= maxCount {
451-
ctx.SendChain(message.At(ctx.Event.UserID), message.Text("[", maxCount, "]请输入正确的序号\n", list))
452-
continue
453-
}
454-
check = true
455-
}
456-
if check {
457-
break
458-
}
459-
}
460-
}
461-
upgradeNum := len(list)
462-
if upgradeNum == 0 || upgradeNum%3 != 0 {
463-
ctx.SendChain(message.At(uid), message.Text("❌ 合成失败:材料数量必须是 3 的倍数(当前选择了 ", upgradeNum, " 个)"))
464-
return
465-
}
345+
engine.OnRegex(`^合成(.+竿|三叉戟)$`, getdb).SetBlock(true).Limit(ctxext.LimitByUser).Handle(func(ctx *zero.Ctx) {
346+
uid := ctx.Event.UserID
347+
thingList := []string{"木竿", "铁竿", "金竿", "钻石竿", "下界合金竿", "三叉戟"}
348+
thingName := ctx.State["regex_matched"].([]string)[1]
349+
indexOfMaterial := -1
350+
for i, name := range thingList {
351+
if thingName == name {
352+
indexOfMaterial = (i - 1)
353+
break
354+
}
355+
}
356+
if indexOfMaterial < 0 {
357+
return
358+
}
359+
articles, err := dbdata.getUserThingInfo(uid, thingList[indexOfMaterial])
360+
if err != nil {
361+
ctx.SendChain(message.Text("[ERROR at pole.go.10]:", err))
362+
return
363+
}
364+
maxCount := len(articles)
365+
if maxCount < 3 {
366+
ctx.SendChain(message.Reply(ctx.Event.MessageID), message.Text("你的合成材料不足"))
367+
return
368+
}
466369

370+
poles := make([]equip, 0, maxCount)
371+
for _, info := range articles {
372+
poleInfo := strings.Split(info.Other, "/")
373+
durable, _ := strconv.Atoi(poleInfo[0])
374+
maintenance, _ := strconv.Atoi(poleInfo[1])
375+
induceLevel, _ := strconv.Atoi(poleInfo[2])
376+
favorLevel, _ := strconv.Atoi(poleInfo[3])
377+
poles = append(poles, equip{
378+
ID: uid,
379+
Equip: info.Name,
380+
Durable: durable,
381+
Maintenance: maintenance,
382+
Induce: induceLevel,
383+
Favor: favorLevel,
384+
})
385+
}
386+
var list []int
387+
check := false
388+
msg := make(message.Message, 0, 3+len(articles))
389+
msg = append(msg, message.Text("找到以下材料 ("+thingList[indexOfMaterial]+"):\n"))
390+
for i, info := range poles {
391+
msg = append(msg, message.Text("[", i, "] ", info.Equip, " : 耐", info.Durable, "/修", info.Maintenance,
392+
"/诱", enchantLevel[info.Induce], "/眷顾", enchantLevel[info.Favor], "\n"))
393+
}
394+
msg = append(msg, message.Text("————————\n"))
395+
msg = append(msg, message.Text("- 输入3个序号进行合成(用空格分割)\n"))
396+
msg = append(msg, message.Text("- 输入“取消”,终止本次合成\n"))
397+
msg = append(msg, message.Text("- 输入“梭哈“,合成所有鱼竿"))
398+
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, msg...))
399+
recv, cancel := zero.NewFutureEvent("message", 999, false, zero.RegexRule(`^(梭哈|取消|(?:\d+\s*)+)$`), zero.CheckUser(ctx.Event.UserID)).Repeat()
400+
defer cancel()
401+
for {
402+
select {
403+
case <-time.After(time.Second * 120):
404+
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("等待超时,取消合成")))
405+
return
406+
case e := <-recv:
407+
nextcmd := strings.TrimSpace(e.Event.Message.String())
408+
if nextcmd == "取消" {
409+
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text("已取消合成")))
410+
return
411+
}
412+
if nextcmd == "梭哈" {
413+
for i := 0; i < (len(articles)/3)*3; i++ {
414+
list = append(list, i)
415+
}
416+
check = true
417+
} else {
418+
parts := strings.Fields(nextcmd)
419+
if len(parts)%3 != 0 {
420+
ctx.SendChain(message.At(ctx.Event.UserID), message.Text("\n合成失败:材料数量必须是 3 的倍数(当前输入了 ", len(parts), " 个)"))
421+
continue
422+
}
423+
tempList := []int{}
424+
valid := true
425+
for _, p := range parts {
426+
idx, err := strconv.Atoi(p)
427+
if err != nil || idx < 0 || idx >= maxCount {
428+
ctx.SendChain(message.At(ctx.Event.UserID), message.Text("\n序号 [", p, "] 超出范围,请重新输入"))
429+
valid = false
430+
break
431+
}
432+
tempList = append(tempList, idx)
433+
}
434+
if valid {
435+
list = tempList
436+
check = true
437+
}
438+
}
439+
}
440+
if check {
441+
break
442+
}
443+
}
444+
upgradeNum := len(list)
467445
groupCount := upgradeNum / 3
468446
var successCount, failCount int
469447
var reportDetails []string
470-
471448
baseTime := time.Now().Unix()
472-
473449
for g := 0; g < groupCount; g++ {
474450
var groupInduce, groupFavor int
475-
476451
for i := 0; i < 3; i++ {
477452
idx := list[g*3+i]
478453
thingInfo := articles[idx]
@@ -482,47 +457,39 @@ func init() {
482457
groupInduce += poles[idx].Induce
483458
groupFavor += poles[idx].Favor
484459
}
485-
486460
if rand.Intn(100) >= 90 {
487461
failCount++
488462
continue
489463
}
490-
491464
successCount++
492465
avgInduce := groupInduce / 3
493466
avgFavor := groupFavor / 3
494467
attribute := strconv.Itoa(durationList[thingName]) + "/0/" + strconv.Itoa(avgInduce) + "/" + strconv.Itoa(avgFavor)
495-
496468
newthing := article{
497469
Duration: baseTime + int64(g*10) + int64(rand.Intn(100)),
498470
Type: "pole",
499471
Name: thingName,
500472
Number: 1,
501473
Other: attribute,
502474
}
503-
504475
err = dbdata.updateUserThingInfo(uid, newthing)
505476
if err != nil {
506477
failCount++
507478
continue
508479
}
509-
510480
if successCount <= 5 {
511-
reportDetails = append(reportDetails, "第 "+strconv.Itoa(successCount)+" 支: [诱钓"+strconv.Itoa(avgInduce)+" 海眷"+strconv.Itoa(avgFavor)+"]")
481+
reportDetails = append(reportDetails, "第 "+strconv.Itoa(successCount)+" 支: [诱钓"+strconv.Itoa(avgInduce)+" 海眷"+strconv.Itoa(avgFavor)+"]")
512482
}
513483
}
514-
515-
finalReport := " 合成报告 \n"
484+
finalReport := "合成报告\n"
516485
finalReport += "消耗材料: " + strconv.Itoa(upgradeNum) + " 个\n"
517486
finalReport += "成功产出: " + strconv.Itoa(successCount) + " 支 | 失败: " + strconv.Itoa(failCount) + " 组\n"
518-
519487
if successCount > 0 {
520488
finalReport += "----\n" + strings.Join(reportDetails, "\n")
521489
if successCount > 5 {
522490
finalReport += "\n...以及其余 " + strconv.Itoa(successCount-5) + " 支属性已略过"
523491
}
524492
}
525-
526493
ctx.Send(message.ReplyWithMessage(ctx.Event.MessageID, message.Text(strings.TrimSpace(finalReport))))
527494
})
528495
}

0 commit comments

Comments
 (0)