//========================================================= // パーティ清算金自動分配NPC // created by Rayce // // ■ mod2230以上のversionでしか作動しません //--------------------------------------------------------- izlude.gat,132,113,4 script 仕切り屋 180,{ // データベース名のセット if('itemdb$ == "") { set 'itemdb$,"db/item_db.txt"; set 'addon$,"db/addon/item_db_add.txt"; set 'value$,"db/item_value_db.txt"; } function GetSellValue; function InitInventoryList; mes "[仕切り屋]"; mes "おうおう、清算は俺に任せな。"; mes "持ってるアイテム全部丸ごと買い取って"; mes "お前のパーティにZenyを分配してやる"; mes "からな。"; next; mes "[仕切り屋]"; mes "料金…?"; mes "おおっと、気にするな。"; mes "ボランティアだよ、ボランティア。"; mes "さぁ、どうする?"; next; if(select("頼みます","お断り!")==2) { mes "[仕切り屋]"; mes "ああ、そうかい。"; mes "勝手にやんな。"; close; } if(getcharid(1) <= 0) { mes "[仕切り屋]"; mes "PT未所属じゃねぇか。"; mes "さすがにそこまでは面倒見きれねぇぜ。"; close; } mes "[仕切り屋]"; mes "よし!"; mes "でもその前に、アイテム欄には売りたい"; mes "ものだけ置いておいてくれよ。"; mes "全部ごっそり買い取るからな!"; mes "装備品だけはそのままでいいぜ。"; next; if(select("少し待って","お願いします")==1) { mes "[仕切り屋]"; mes "売っていいアイテムかどうか、よーく"; mes "確かめてから来な。"; close; } set '@skilllv,getskilllv(38); // オーバーチャージのスキルLvを取得 if('@skilllv > 0) set '@rate,5+'@skilllv*2-(('@skilllv==10)? 1: 0); InitInventoryList; getinventorylist; // アイテムリストの検索 for(set '@i,0; '@i < @inventorylist_count; set '@i,'@i+1) { // 装備してるか破損装備品は除外 if(@inventorylist_equip['@i] || @inventorylist_attribute['@i]) continue; // 清算品で精錬してることは無いと思うので事故防止のため弾く if(@inventorylist_refine['@i] > 0) continue; set '@val,GetSellValue(@inventorylist_id['@i]); if('oc_flag) { set '@rate,0; set 'oc_flag,0; } set '@total,'@total + ('@val*(100+'@rate)/100) * @inventorylist_amount['@i]; set '@count,'@count+1; } if('@count <= 0) { mes "[仕切り屋]"; mes "買い取れるアイテムが1個もないじゃ"; mes "ないか。"; close; } // 途中でアイテムリストが変動してるかどうか照合するために実行速度を犠牲にして情報を全てコピー copyarray '@inventory_id, @inventorylist_id, 128; copyarray '@inventory_amount, @inventorylist_amount, 128; copyarray '@inventory_equip, @inventorylist_equip, 128; copyarray '@inventory_refine, @inventorylist_refine, 128; copyarray '@inventory_identify, @inventorylist_identify, 128; copyarray '@inventory_attribute, @inventorylist_attribute, 128; copyarray '@inventory_card1, @inventorylist_card1, 128; copyarray '@inventory_card2, @inventorylist_card2, 128; copyarray '@inventory_card3, @inventorylist_card3, 128; copyarray '@inventory_card4, @inventorylist_card4, 128; // アタッチ出来る人をリストアップ set '@accid,getcharid(3); getpartymember getcharid(1); detachrid; for(set '@i,0; '@i < $@partymembercount; set '@i,'@i+1) { set '@idlist['@j],getcharid(3,$@partymembername$['@i]); if( !attachrid('@idlist['@j]) ) set '@idlist['@j],0; else set '@j,'@j+1; detachrid; } if(!attachrid('@accid)) // 話掛けたPCを再度アタッチ end; set '@size,getarraysize('@idlist); if('@size <= 0) close; set '@z,'@total / '@size; mes "[仕切り屋]"; mes "合計で ^ff0000" +'@total+ "^000000 zenyだ。"; mes "お前ら全員で" +'@size+ "人だから"; mes "一人当たり ^ff0000" +'@z+ "^000000 zenyになるな。"; mes "文句はないか?"; next; if(select("ないです","考え直す")==2) { mes "[仕切り屋]"; mes "まぁ、焦ることはないからな。"; close; } // アイテムリストが変動してないか照合する InitInventoryList; getinventorylist; if(@inventorylist_count != getarraysize(@inventorylist_id)) { set '@fail,1; } else { // memcmpに相当する関数がないので手動比較 for(set '@i,0; '@i < @inventorylist_count; set '@i,'@i+1) { if( @inventorylist_id['@i] != '@inventory_id['@i] || @inventorylist_amount['@i] != '@inventory_amount['@i] || @inventorylist_equip['@i] != '@inventory_equip['@i] || @inventorylist_refine['@i] != '@inventory_refine['@i] || @inventorylist_identify['@i] != '@inventory_identify['@i] || @inventorylist_attribute['@i] != '@inventory_attribute['@i] || @inventorylist_card1['@i] != '@inventory_card1['@i] || @inventorylist_card2['@i] != '@inventory_card2['@i] || @inventorylist_card3['@i] != '@inventory_card3['@i] || @inventorylist_card4['@i] != '@inventory_card4['@i] ) { set '@fail,1; break; } } } if('@fail) { mes "[仕切り屋]"; mes "おう!アイテムの並びが変わってるな?"; mes "さすがの俺でも計算が狂っちまうから"; mes "もういっぺんやり直してくれ。"; close; } // 話掛けたPCのインベントリから該当アイテムを削除 for(set '@i,0; '@i < @inventorylist_count; set '@i,'@i+1) { if(@inventorylist_equip['@i] || @inventorylist_attribute['@i]) continue; if(@inventorylist_refine['@i] > 0) continue; delitem2 '@i,@inventorylist_amount['@i]; } // PT所属で且つアタッチ可能なPCにZenyの分配処理 for(set '@i,0; '@i < '@size; set '@i,'@i+1) { if( attachrid('@idlist['@i]) ) { set Zeny,Zeny + '@z; dispbottom "仕切り屋より " +'@z+ " zenyが配当されました。"; detachrid; } // 面倒なのでここでアタッチ出来なかったらその人の配当金は闇に消える } if(!attachrid('@accid)) // 話掛けたPCを再度アタッチ end; mes "[仕切り屋]"; mes "よーし、これで完璧だ。"; mes "またいつでも声を掛けてくれよ。"; close; // function : インベントリ情報用の変数を初期化 function InitInventoryList { cleararray @inventorylist_id, 0, 128; cleararray @inventorylist_amount, 0, 128; cleararray @inventorylist_equip, 0, 128; cleararray @inventorylist_refine, 0, 128; cleararray @inventorylist_identify, 0, 128; cleararray @inventorylist_attribute, 0, 128; cleararray @inventorylist_card1, 0, 128; cleararray @inventorylist_card2, 0, 128; cleararray @inventorylist_card3, 0, 128; cleararray @inventorylist_card4, 0, 128; return; } // function : 売値を返す function GetSellValue { set 'oc_flag,0; // item_value_db.txtが最優先 set '@row,csvfind('value$,0,getarg(0)); if('@row >= 0) { if(csvread('value$,'@row,6) == "1") set 'oc_flag,1; // OC不可フラグがあるなら set '@buf$,csvread('value$,'@row,4); if('@buf$ != "") return '@buf$; } set '@row,csvfind('addon$,0,getarg(0)); if('@row >= 0) { set '@buf$,csvread('addon$,'@row,5); if('@buf$ != "") return '@buf$; else { set '@val,csvread('addon$,'@row,4); // Priceを数値として変換 return '@val/2; } } set '@row,csvfind('itemdb$,0,getarg(0)); if('@row >= 0) { set '@buf$,csvread('itemdb$,'@row,5); if('@buf$ != "") return '@buf$; else { set '@val,csvread('itemdb$,'@row,4); // Priceを数値として変換 return '@val/2; } } close; // 不正なので終了 } }