#!/bin/sh # The item-mall NPC shop (40250's 商城 was an external web shop that 203 never had). Run on the server from # this directory, then restart db + game (README.md). Safe to run again: prices and the shop are rewritten # from items.tsv, the NPC is only added to a village that does not have one yet. set -eu SERVER=${SERVER:-/usr/metin2/server} LOCALE=${LOCALE:-newcibn} SHOP_VNUM=14 NPC_VNUM=9010 HERE=$(cd "$(dirname "$0")" && pwd) ITEMS="$HERE/items.tsv" PROTO="$SERVER/share/conf/item_proto.txt" MOB_PROTO="$SERVER/share/conf/mob_proto.txt" MAPS="$SERVER/share/locale/$LOCALE/map" BACKUP=/root/backup-itemmall/$(date +%Y%m%d-%H%M%S) export LC_ALL=C # village: map, then the NPC position (next to the general store 9003) and facing. VILLAGES="metin2_map_a1 686 565 8 metin2_map_b1 598 689 4 metin2_map_c1 391 693 5" mkdir -p "$BACKUP" cp -p "$PROTO" "$BACKUP/item_proto.txt" cp -p "$MOB_PROTO" "$BACKUP/mob_proto.txt" echo "$VILLAGES" | while read -r map x y dir; do cp -p "$MAPS/$map/npc.txt" "$BACKUP/$map.npc.txt"; done mysqldump -uroot player shop shop_item item_proto mob_proto > "$BACKUP/player-shop.sql" echo "backup: $BACKUP" # item_proto.txt column 10 is the price an NPC shop sells the item for (TItemTable::dwGold). awk -F'\t' -v OFS='\t' 'NR == FNR { if ($1 !~ /^#/ && NF >= 3) { price[$1] = $3; want++ } next } ($1 in price) { $10 = price[$1]; n++ } { print } END { if (n != want) { print "item_proto.txt: " n " of " want " items found" > "/dev/stderr"; exit 1 } }' \ "$ITEMS" "$PROTO" > "$BACKUP/item_proto.new" cat "$BACKUP/item_proto.new" > "$PROTO" # mob_proto.txt column 14 is ON_CLICK: the NPC only opens its shop with 1 (ON_CLICK_SHOP, trigger.cpp); # 9010 ships with 2, which has no handler. awk -F'\t' -v OFS='\t' -v v=$NPC_VNUM '$1 == v { $14 = 1; n++ } { print } END { if (n != 1) { print "mob_proto.txt: NPC " v " not found" > "/dev/stderr"; exit 1 } }' \ "$MOB_PROTO" > "$BACKUP/mob_proto.new" cat "$BACKUP/mob_proto.new" > "$MOB_PROTO" { 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, 'item_mall', $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 echo "$VILLAGES" | while read -r map x y dir; do npc="$MAPS/$map/npc.txt" if awk -F'\t' -v v=$NPC_VNUM '$11 == v { found = 1 } END { exit !found }' "$npc"; then echo "$map: NPC $NPC_VNUM already placed" else [ -z "$(tail -c 1 "$npc")" ] || echo >> "$npc" printf 'm\t%d\t%d\t0\t0\t0\t%d\t1m\t100\t1\t%d\n' "$x" "$y" "$dir" "$NPC_VNUM" >> "$npc" echo "$map: NPC $NPC_VNUM at $x,$y" fi done mysql -uroot player -N -e "SELECT COUNT(*) FROM shop_item WHERE shop_vnum = $SHOP_VNUM" echo "done; restart db and game (README.md)"