server: unlimited teleport ring 70058, sold in a two-page item mall
ring-warp/: ring_warp.quest without use count or cooldown (the ring is never used up) + install.sh (GBK, make.py, item name 移动戒指). npc-shops: [page] lines in items.tsv make an extended shop written to shop_table_ex.txt; item-mall is now 增益 (29) + 道具 (12, incl. 70058 at 1 gold). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5.5
parent
000d4841fd
commit
42e4cf1a9f
@@ -16,10 +16,14 @@ MAPS="$SERVER/share/locale/$LOCALE/map"
|
||||
export LC_ALL=C
|
||||
|
||||
# SHOP_VNUM, SHOP_NAME, NPC_VNUM, VILLAGES (one "map x y facing" line per village) and optionally NPC_NAME
|
||||
# (UTF-8), the name shown over the NPC.
|
||||
# (UTF-8), the name shown over the NPC; TAB_VNUMS, the shop vnums of pages 2 and 3 when items.tsv has
|
||||
# [page name] lines.
|
||||
NPC_NAME=
|
||||
TAB_VNUMS=
|
||||
. "$SHOP_DIR/shop.conf"
|
||||
MOB_NAMES="$SERVER/share/conf/mob_names.txt"
|
||||
SHOP_EX="$SERVER/share/locale/$LOCALE/shop_table_ex.txt"
|
||||
EX_MARK="# npc-shops/install.sh $SHOP_NAME"
|
||||
BACKUP=/root/backup-npcshop/$SHOP_NAME-$(date +%Y%m%d-%H%M%S)
|
||||
|
||||
mkdir -p "$BACKUP"
|
||||
@@ -27,6 +31,7 @@ cp -p "$PROTO" "$BACKUP/item_proto.txt"
|
||||
cp -p "$MOB_PROTO" "$BACKUP/mob_proto.txt"
|
||||
cp -p "$MOB_NAMES" "$BACKUP/mob_names.txt"
|
||||
echo "$VILLAGES" | while read -r map x y dir; do cp -p "$MAPS/$map/npc.txt" "$BACKUP/$map.npc.txt"; done
|
||||
[ ! -f "$SHOP_EX" ] || cp -p "$SHOP_EX" "$BACKUP/shop_table_ex.txt"
|
||||
mysqldump -uroot player shop shop_item item_proto mob_proto > "$BACKUP/player-shop.sql"
|
||||
echo "backup: $BACKUP"
|
||||
|
||||
@@ -53,13 +58,49 @@ if [ -n "$NPC_NAME" ]; then
|
||||
cat "$BACKUP/mob_names.new" > "$MOB_NAMES"
|
||||
fi
|
||||
|
||||
{
|
||||
awk -F'\t' '$1 !~ /^#/ && NF >= 3 { printf "UPDATE item_proto SET gold = %d WHERE vnum = %d;\n", $3, $1 }' "$ITEMS"
|
||||
echo "UPDATE mob_proto SET on_click = 1 WHERE vnum = $NPC_VNUM;"
|
||||
echo "REPLACE INTO shop (vnum, name, npc_vnum) VALUES ($SHOP_VNUM, '$SHOP_NAME', $NPC_VNUM);"
|
||||
echo "DELETE FROM shop_item WHERE shop_vnum = $SHOP_VNUM;"
|
||||
awk -F'\t' -v shop=$SHOP_VNUM '$1 !~ /^#/ && NF >= 3 { printf "INSERT INTO shop_item (shop_vnum, item_vnum, count) VALUES (%d, %d, %d);\n", shop, $1, $2 }' "$ITEMS"
|
||||
} | mysql -uroot player
|
||||
# A shop with pages ([page name] lines) is an extended shop: game reads it from shop_table_ex.txt, one
|
||||
# group per page, and refuses an NPC that also has a shop in the DB.
|
||||
if grep -q '^\[' "$ITEMS"; then
|
||||
if [ -f "$SHOP_EX" ] && ! head -1 "$SHOP_EX" | grep -qxF "$EX_MARK"; then
|
||||
echo "$SHOP_EX belongs to another shop" >&2; exit 1
|
||||
fi
|
||||
awk -F'\t' -v npc=$NPC_VNUM -v shop="$SHOP_NAME" -v vnums="$SHOP_VNUM $TAB_VNUMS" -v mark="$EX_MARK" '
|
||||
/^\[/ { name[++pages] = substr($1, 2, length($1) - 2); next }
|
||||
$1 !~ /^#/ && NF >= 3 { if (!pages) exit 1; n = ++count[pages]; row[pages, n] = $1 "\t" $2 "\t" $3 }
|
||||
END {
|
||||
split(vnums, vnum, " ")
|
||||
if (pages > 3 || !(pages in vnum)) { print "items.tsv: " pages " pages, TAB_VNUMS too short or more than 3" > "/dev/stderr"; exit 1 }
|
||||
print mark
|
||||
print "Group\tShopNPC\n{\n\t#--#\tnpc\tgroup"
|
||||
for (p = 1; p <= pages; p++) printf "\t%d\t%d\t%s_%d\n", p, npc, shop, p
|
||||
print "}"
|
||||
for (p = 1; p <= pages; p++) {
|
||||
if (count[p] > 39) { print "items.tsv: page " p " has more than 39 items" > "/dev/stderr"; exit 1 }
|
||||
# Rows are read in key order (a std::map), so the keys are zero-padded.
|
||||
printf "Group\t%s_%d\n{\n\tVnum\t%d\n\tName\t%s\n\tGroup\titems\n\t{\n\t\t#--#\tvnum\tcount\tprice\n", shop, p, vnum[p], name[p]
|
||||
for (i = 1; i <= count[p]; i++) printf "\t\t%02d\t%s\n", i, row[p, i]
|
||||
print "\t}\n}"
|
||||
}
|
||||
}' "$ITEMS" > "$BACKUP/shop_table_ex.utf8"
|
||||
# Page names go to the client in the locale's code page.
|
||||
iconv -f UTF-8 -t GB2312 "$BACKUP/shop_table_ex.utf8" > "$SHOP_EX"
|
||||
vnums=$(echo $SHOP_VNUM $TAB_VNUMS | tr ' ' ',')
|
||||
{
|
||||
awk -F'\t' '$1 !~ /^#/ && NF >= 3 { printf "UPDATE item_proto SET gold = %d WHERE vnum = %d;\n", $3, $1 }' "$ITEMS"
|
||||
echo "UPDATE mob_proto SET on_click = 1 WHERE vnum = $NPC_VNUM;"
|
||||
echo "DELETE FROM shop_item WHERE shop_vnum IN ($vnums);"
|
||||
echo "DELETE FROM shop WHERE vnum IN ($vnums);"
|
||||
} | mysql -uroot player
|
||||
echo "$SHOP_EX: $(grep -c '^Group' "$SHOP_EX") groups"
|
||||
else
|
||||
{
|
||||
awk -F'\t' '$1 !~ /^#/ && NF >= 3 { printf "UPDATE item_proto SET gold = %d WHERE vnum = %d;\n", $3, $1 }' "$ITEMS"
|
||||
echo "UPDATE mob_proto SET on_click = 1 WHERE vnum = $NPC_VNUM;"
|
||||
echo "REPLACE INTO shop (vnum, name, npc_vnum) VALUES ($SHOP_VNUM, '$SHOP_NAME', $NPC_VNUM);"
|
||||
echo "DELETE FROM shop_item WHERE shop_vnum = $SHOP_VNUM;"
|
||||
awk -F'\t' -v shop=$SHOP_VNUM '$1 !~ /^#/ && NF >= 3 { printf "INSERT INTO shop_item (shop_vnum, item_vnum, count) VALUES (%d, %d, %d);\n", shop, $1, $2 }' "$ITEMS"
|
||||
} | mysql -uroot player
|
||||
fi
|
||||
|
||||
echo "$VILLAGES" | while read -r map x y dir; do
|
||||
npc="$MAPS/$map/npc.txt"
|
||||
@@ -72,5 +113,5 @@ echo "$VILLAGES" | while read -r map x y dir; do
|
||||
fi
|
||||
done
|
||||
|
||||
mysql -uroot player -N -e "SELECT COUNT(*) FROM shop_item WHERE shop_vnum = $SHOP_VNUM"
|
||||
grep -q '^\[' "$ITEMS" || mysql -uroot player -N -e "SELECT COUNT(*) FROM shop_item WHERE shop_vnum = $SHOP_VNUM"
|
||||
echo "done; restart db and game (README.md)"
|
||||
|
||||
Reference in New Issue
Block a user