Jump to content

Winterfox

Members
  • Posts

    240
  • Joined

  • Last visited

  • Days Won

    19

Posts posted by Winterfox

  1. yggdrasil01,194,95,0	script	Cultivated Soil	HIDDEN_NPC,{
    	if(CSOIL_GROWTH_DURATION == 0 && countitem(.plantItemId) < .plantItemAmt) {
    		mes "You need " + .plantItemAmt + " x " + getitemname(.plantItemId) + " to use the cultivated soil.";
    		close;
    	}
    
    	if(CSOIL_GROWTH_DURATION == 0) {
    		delitem(.plantItemId, .plantItemAmt);
    		mes "Seed planted. Let's wait " + .growthDays + " days before harvesting.";
    		CSOIL_GROWTH_DURATION = gettimetick(2) + (.growthDays * 86400);
    		close;
    	}
    
    	if (gettimetick(2) > CSOIL_GROWTH_DURATION) {
    		getitem(.grownItemId, .grownItemAmt);
    		CSOIL_GROWTH_DURATION = 0;
    		end;
    	}
    
    	mes "This is still not ripe for the picking.";
    	mes "Let's wait until it's ready for harvest.";
    	close;
    
    	OnInit:
    		.growthDays = 10;
    		
    		.plantItemId = 512;
    		.plantItemAmt = 1;
    		
    		.grownItemId = 607;
    		.grownItemAmt = 1;
    }

     

  2. You need to search the skill you want to change in the status.yml and under Flags you have to set NoSave to true.

    Here is an example from the original files:

      - Status: Bleeding
        Icon: EFST_BLOODING
        DurationLookup: NPC_BLEEDING
        CalcFlags:
          Regen: true
        Opt2:
          Bleeding: true
        Flags:
          SendOption: true
          BossResist: true
          NoSave: true
          NoClearance: true
          RemoveOnHermode: true
        Fail:
          Refresh: true
          Inspiration: true

     

  3. -	script	ZENY_CONVERTER	FAKE_NPC,{
    	OnConvert:
    		.@amt = floor(Zeny / .convZeny, 1);
    		if(.@amt <= 0) {
    			dispbottom("You don't have enough zeny for a conversion. You need atleast " + callfunc("F_InsertComma", .convRate) + "z.");
    			end;
    		}
    		.@price = .@amt * .convZeny;
    
    		Zeny -= .@price;
    		getitem(.itemId, .@amt * .convItem);
    		dispbottom(callfunc("F_InsertComma", .@price) + " of your zeny got converted to " + .@amt + " x " + getitemname(.itemId));
    		end;
    
    	OnInit:
    		.itemId = 22787;
            .convItem = 1;
            .convZeny = 100000000;
    
    		bindatcmd("convert", strnpcinfo(3) + "::OnConvert");
    }

     

  4. The changed clif.cpp uses npc_duplicate_npc_for_player when you click the button. That function is what spawns the NPC near your character.
    So that is not a scripting issue, but one you will have to solve via modifying the source code so that the NPC gets called instead of being spawned near the character.

  5. There is nothing in that script that would make it spawn near your character. It sounds like you use duplicate_dynamic which spawns a copy of a NPC near your character.
    Also it doesn't make sense for a NPC that you don't want to be visible to have data about the map and sprite.
     

    -	script	Hourly Point Manager::GOLDPCCAFE	FAKE_NPC,{
        cutin("ep18_merchant.png", 2);
        callshop("hourly_shop", 1);
        npcshopattach("hourly_shop");
        end;
    
        OnBuyItem:
            mes("[Hourly Point Manager]");
            if (!checkweight2(@bought_nameid, @bought_quantity)) {
                mes("Sorry, you can't carry all these items!");
                close3;
            }
            
            for (.@i = 0; .@i < getarraysize(@bought_nameid); .@i++){
                .@itemIndex = inarray(.Shop, @bought_nameid[.@i]);
                .@costs += (.Shop[.@itemIndex + 1] * @bought_quantity[.@i]);
            }
    
            if (.@costs > Goldpc_Points) {
                mes("You don't have enough Hourly Points.");
                close3;
            }
    
            Goldpc_Points -= .@costs;
            for(.@i = 0; .@i < getarraysize(@bought_nameid); .@i++) {
                getitem(@bought_nameid[.@i], @bought_quantity[.@i]);
                dispbottom("Purchased " + @bought_quantity[.@i] + " x " + getitemname(@bought_nameid[.@i]) + ".");
            }
    
            mes("Purchased successfully!");
            mes("You have ^0000ff" + Goldpc_Points + "^000000 points remaining.");
            close3;
    
        OnInit:
            setarray(.Shop[0], 13534, 1, 13810, 1, 14532, 1, 14606, 1, 12211, 1, 7776, 25);
            npcshopitem("hourly_shop", 13534, 1, 13810, 1, 14532, 1, 14606, 1, 12211, 1, 7776, 25);
    }

     

  6. -    script    WOE_ITEM_RESTRICTION    FAKE_NPC, {
        OnInit:
            setarray(.woeMaps$[0], "prtg_cas01", "prtg_cas02", "prtg_cas03", "prtg_cas04", "prtg_cas05", "payg_cas01", "payg_cas02", "payg_cas03", "payg_cas04", "payg_cas05", "gefg_cas01", "gefg_cas02", "gefg_cas03", "gefg_cas04", "gefg_cas05", "aldeg_cas01", "aldeg_cas02", "aldeg_cas03", "aldeg_cas04", "aldeg_cas05", "arug_cas01", "arug_cas02", "arug_cas03", "arug_cas04", "arug_cas05", "schg_cas01", "schg_cas02", "schg_cas03", "schg_cas04", "schg_cas05");
            end;
    
        OnPCLoadMapEvent:
            if(!inarray(.woeMaps$, strcharinfo(3)) || (!isequipped(45097) && !isequipped(45166))) end;
            
            mes "You can't wear Spiderman or Akatsuki suit on this map!";
            close2;
            warp("Save", 0, 0);
    }
    
    prtg_cas01    mapflag    loadevent
    prtg_cas02    mapflag    loadevent
    prtg_cas03    mapflag    loadevent
    prtg_cas04    mapflag    loadevent
    prtg_cas05    mapflag    loadevent
    
    payg_cas01    mapflag    loadevent
    payg_cas02    mapflag    loadevent
    payg_cas03    mapflag    loadevent
    payg_cas04    mapflag    loadevent
    payg_cas05    mapflag    loadevent
    
    gefg_cas01    mapflag    loadevent
    gefg_cas02    mapflag    loadevent
    gefg_cas03    mapflag    loadevent
    gefg_cas04    mapflag    loadevent
    gefg_cas05    mapflag    loadevent
    
    aldeg_cas01    mapflag    loadevent
    aldeg_cas02    mapflag    loadevent
    aldeg_cas03    mapflag    loadevent
    aldeg_cas04    mapflag    loadevent
    aldeg_cas05    mapflag    loadevent
    
    arug_cas01    mapflag    loadevent
    arug_cas02    mapflag    loadevent
    arug_cas03    mapflag    loadevent
    arug_cas04    mapflag    loadevent
    arug_cas05    mapflag    loadevent
    
    schg_cas01    mapflag    loadevent
    schg_cas02    mapflag    loadevent
    schg_cas03    mapflag    loadevent
    schg_cas04    mapflag    loadevent
    schg_cas05    mapflag    loadevent

     

  7. prontera,156,179,6	script	Suhnbi#custom	85,{
    	disable_items;
    	mes "[Suhnbi]";
    	mes "I am the Armsmith.";
    	mes "I can refine all kinds of weapons,";
    	mes "armor and equipment, so let me";
    	mes "know what you want to refine.";
    	next;
    
    	setarray(.@indices[0], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW);
    	for(.@i = 0; .@i < 10; .@i++) {
    		if (getequipisequiped(.@indices[.@i])) {
    			.@menu$[.@i] = F_getpositionname(.@indices[.@i]) + "-[" + getequipname(.@indices[.@i]) + "]";
    			.@equipped = 1;
    		}
    	}
    
    	if (.@equipped == 0) {
    		mes "[Suhnbi]";
    		mes "I don't think I can refine any items you have...";
    		close;
    	}
    	
        .@equip = .@indices[select(implode(.@menu$, ":")) - 1];
    
    	if (!getequipisequiped(.@equip)) 
    		end;
    
    	if (!getequipisenableref(.@equip)) {
    		mes "[Suhnbi]";
    		mes "Go find another Blacksmith. You can't refine this thing.";
    		close;
    	}
    
    	if (getequiprefinerycnt(.@equip) >= 20) {
    		mes "[Suhnbi]";
    		mes "Hmm... someone perfected this already. I don't think I can work on it further.";
    		close;
    	}
    
    	.@refineitemid = getequipid(.@equip); 
    	.@refinerycnt = getequiprefinerycnt(.@equip); 
    	.@price = getequiprefinecost(.@equip, REFINE_COST_NORMAL, REFINE_ZENY_COST);
    	.@itemtype = getiteminfo(.@refineitemid, ITEMINFO_TYPE);
    	.@equipLvl = (.@itemtype == IT_WEAPON) ? getequipweaponlv(.@equip) : getequiparmorlv(.@equip);
    
    	mes "[Suhnbi]";
    	if (.@itemtype == IT_WEAPON)
            mes "You want to refine a level " + .@equipLvl + " weapon?";
        mes "To refine that, you'll need to have " + .itemCostAmount + " ^ff9999" + ((.@refinerycnt > 0) ? "+" + .@refinerycnt + " " : "") + getitemname(.@refineitemid) +  "^000000 and " + callfunc("F_InsertComma", .@price) + " zeny.";
    	mes "Would you like to continue?";
    	next;
    	
        if(select("Yes:No") == 2) {
            mes "[Suhnbi]";
            mes "I can't help it even if you're not happy about it...";
            close;
        }
    
        .@idx = 0;
        getinventorylist(getcharid(0));
        for(.@i = 0; .@i < @inventorylist_count; .@i++) {
            if(@inventorylist_id[.@i] == .@refineitemid && @inventorylist_refine[.@i] == .@refinerycnt && @inventorylist_equip[.@i] == 0) {
                .@itemReqIdxs[.@idx] = @inventorylist_idx[.@i];
                .@idx++;
            }
    
            if(.@idx == .itemCostAmount) break;
        }
    
        if (getarraysize(.@itemReqIdxs) < .itemCostAmount || Zeny < .@price) {
            mes "[Suhnbi]";
            mes "Are these all you have?";
            mes "I'm very sorry, but I can't do anything without all the materials. Besides, I deserve some payments for my work, don't I?";
            close;
        }
    
        Zeny -= .@price;
        for(.@i = 0; .@i < getarraysize(.@itemReqIdxs); .@i++)
            delitemidx(.@itemReqIdxs[.@i], 1);
    
        if (callfunc("F_IsEquipIDHack", .@equip, .@refineitemid) ||
            callfunc("F_IsEquipRefineHack", .@equip, .@refinerycnt) || callfunc("F_IsEquipCardHack", .@equip,  getequipcardid(.@equip, 0),  getequipcardid(.@equip, 1),  getequipcardid(.@equip, 2),  getequipcardid(.@equip, 3))) {
            mes "[Suhnbi]";
            emotion(ET_FRET);
            mes "Wait a second...";
            mes "Do you think I'm stupid?!";
            mes "You switched the item while I wasn't looking! Get out of here!";
            close;
        }
    
    	mes "[Suhnbi]";
    	mes "Clang! Clang! Clang!";
        successrefitem(.@equip);
        next;
        emotion(ET_BEST);
        mes "[Suhnbi]";
        mes "There you go! It's done.";
        mes "It's been a while since I've made such a fine " + ((.@itemtype == IT_WEAPON) ? "weapon" : "armor") + ". You must be happy because it has become stronger!";
        close;
    
        OnInit:
            .itemCostAmount = 2;
    }

     

    • Upvote 1
    • Love 1
  8. prontera,156,179,6	script	Suhnbi#custom	85,{
    	disable_items;
    	mes "[Suhnbi]";
    	mes "I am the Armsmith.";
    	mes "I can refine all kinds of weapons,";
    	mes "armor and equipment, so let me";
    	mes "know what you want to refine.";
    	next;
    
    	setarray(.@indices[0], EQI_HEAD_TOP, EQI_ARMOR, EQI_HAND_L, EQI_HAND_R, EQI_GARMENT, EQI_SHOES, EQI_ACC_L, EQI_ACC_R, EQI_HEAD_MID, EQI_HEAD_LOW);
    	for(.@i = 0; .@i < 10; .@i++) {
    		if (getequipisequiped(.@indices[.@i])) {
    			.@menu$[.@i] = F_getpositionname(.@indices[.@i]) + "-[" + getequipname(.@indices[.@i]) + "]";
    			.@equipped = 1;
    		}
    	}
    
    	if (.@equipped == 0) {
    		mes "[Suhnbi]";
    		mes "I don't think I can refine any items you have...";
    		close;
    	}
    	
        .@equip = .@indices[select(implode(.@menu$, ":")) - 1];
    
    	if (!getequipisequiped(.@equip)) 
    		end;
    
    	if (!getequipisenableref(.@equip)) {
    		mes "[Suhnbi]";
    		mes "Go find another Blacksmith. You can't refine this thing.";
    		close;
    	}
    
    	if (getequiprefinerycnt(.@equip) >= 20) {
    		mes "[Suhnbi]";
    		mes "Hmm... someone perfected this already. I don't think I can work on it further.";
    		close;
    	}
    
    	.@refineitemid = getequipid(.@equip); 
    	.@refinerycnt = getequiprefinerycnt(.@equip); 
    	.@price = getequiprefinecost(.@equip, REFINE_COST_NORMAL, REFINE_ZENY_COST);
    	.@itemtype = getiteminfo(.@refineitemid, ITEMINFO_TYPE);
    	.@equipLvl = (.@itemtype == IT_WEAPON) ? getequipweaponlv(.@equip) : getequiparmorlv(.@equip);
    
    	mes "[Suhnbi]";
    	if (.@itemtype == IT_WEAPON)
            mes "You want to refine a level " + .@equipLvl + " weapon?";
        mes "To refine that, you'll need to have two ^ff9999" + ((.@refinerycnt > 0) ? "+" + .@refinerycnt + " " : "") + getitemname(.@refineitemid) +  "^000000 and " + callfunc("F_InsertComma", .@price) + " zeny.";
    	mes "Would you like to continue?";
    	next;
    	
        if(select("Yes:No") == 2) {
            mes "[Suhnbi]";
            mes "I can't help it even if you're not happy about it...";
            close;
        }
    
        if (getequippercentrefinery(.@equip) < 100) {
            if (.@itemtype == IT_WEAPON) {
                mes "[Suhnbi]";
                mes "Wow!!";
                mes "This weapon probably";
                mes "looks like it's been refined...";
                mes "many times...";
                mes "It may break if";
                mes "you refine it again.";
                next;
                mes "And if it breaks,";
                mes "you can't use it anymore!";
                mes "All the cards in it and the properties ^ff0000will be lost^000000!";
                mes "^ff0000Besides, the equipment will break!^000000";
                mes "Are you sure you still want to continue?";
                next;
                if(select("Yes:No") == 2) {
                    mes "[Suhnbi]";
                    mes "Good.";
                    mes "Because if the weapon breaks from unreasonable refining, then I get a bad mood, too.";
                    close;
                }
            } else {
                mes "[Suhnbi]";
                mes "Giggle. Giggle. Oh, you have guts, daring to refine this.";
                mes "You know it's pretty risky, don't you?";
                next;
                mes "If your defensive equipment is broken, you'll never be able to use it again.";
                mes "Even your cards and your modifications will ^ff0000completely disappear^000000.";
                mes "Do you really wish to continue?";
                next;
                if(select("Yes:No") == 2) {
                    mes "[Suhnbi]";
                    mes "What nonsense. You waste my precious time.";
                    mes "Get lost, punk.";
                    close;
                }
            }
        }
    
        .@idx = 0;
        getinventorylist(getcharid(0));
        for(.@i = 0; .@i < @inventorylist_count; .@i++) {
            if(@inventorylist_id[.@i] == .@refineitemid && @inventorylist_refine[.@i] == .@refinerycnt && @inventorylist_equip[.@i] == 0) {
                .@itemReqIdxs[.@idx] = @inventorylist_idx[.@i];
                .@idx++;
            }
    
            if(.@idx == .itemCostAmount) break;
        }
    
        if (getarraysize(.@itemReqIdxs) < .itemCostAmount || Zeny < .@price) {
            mes "[Suhnbi]";
            mes "Are these all you have?";
            mes "I'm very sorry, but I can't do anything without all the materials. Besides, I deserve some payments for my work, don't I?";
            close;
        }
    
        Zeny -= .@price;
        for(.@i = 0; .@i < getarraysize(.@itemReqIdxs); .@i++)
            delitemidx(.@itemReqIdxs[.@i], 1);
    
        if (callfunc("F_IsEquipIDHack", .@equip, .@refineitemid) ||
            callfunc("F_IsEquipRefineHack", .@equip, .@refinerycnt) || callfunc("F_IsEquipCardHack", .@equip,  getequipcardid(.@equip, 0),  getequipcardid(.@equip, 1),  getequipcardid(.@equip, 2),  getequipcardid(.@equip, 3))) {
            mes "[Suhnbi]";
            emotion(ET_FRET);
            mes "Wait a second...";
            mes "Do you think I'm stupid?!";
            mes "You switched the item while I wasn't looking! Get out of here!";
            close;
        }
    
    	mes "[Suhnbi]";
    	mes "Clang! Clang! Clang!";
    	if (getequippercentrefinery(.@equip) > rand(100)) {
    		successrefitem(.@equip);
    		next;
    		emotion(ET_BEST);
    		mes "[Suhnbi]";
    		mes "There you go! It's done.";
    		mes "It's been a while since I've made such a fine " + ((.@itemtype == IT_WEAPON) ? "weapon" : "armor") + ". You must be happy because it has become stronger!";
    		close;
    	}
    
    	failedrefitem(.@equip);
    	next;
    	emotion (!rand(5)) ? ET_MONEY : ET_HUK;
    	mes "[Suhnbi]";
    	mes "Uuuuuuuuuummmmmph!!!";
    	next;
    	mes "[Suhnbi]";
    	mes "...";
    	mes ".....";
    	mes ".......Huhuhuhuhu~";
    	mes "........It was your choice and my ability, no regret.";
    	close;
    
        OnInit:
            .itemCostAmount = 2;
    }

     

    • Love 2
  9. function	script	ZENYLADDER	{
    	query_sql("SELECT `c`.`name`, `c`.`class`, `c`.`base_level`, `c`.`job_level`, `c`.`zeny`, `g`.`name` FROM `char` c LEFT JOIN (`guild` g) ON (`c`.`guild_id` = `g`.`guild_id`) ORDER BY `c`.`zeny` DESC LIMIT 100", .@names$, .@classes, .@blvls, .@jlvls, .@zeny, .@guilds$);	
    
    	mes "[ INFORMATION ]";
    	for(.@i = 0; .@i < 100; .@i++)
    	    mes "^0000FF" + (.@i + 1) + ".^000000 " + .@names$[.@i] + " - ^FF0000" + callfunc("F_InsertComma", .@zeny[.@i]) + "^000000z";
    	close;
    }

     

    • Upvote 1
  10. I didn't see any security issues, but two small things that could be handled a bit smoother.

    The first is to add a check if the items bought can be carried by the player.
     

    if (!checkweight2(@bought_nameid, @bought_quantity)) {
    	mes("Sorry, you can't carry all these items!");
    	close3;
    }

    The second is that if you use shop and the player has not enough zeny even though you want to pay with points, he can't put the item in the buy window. So pointshop is the better option.
     

    -	pointshop	hourly_shop	-1,Goldpc_Points,13534:-1.

    If you use pointshop you also could omit the whole npcshopattach implementation, if you do not care about the cutin and the message boxes in between.

    Putting the two above mentioned changes into you npc it could look like this:

    -	pointshop	hourly_shop	-1,Goldpc_Points,13534:-1.
    
    prontera,156,181,5	script	Hourly Point Manager::GOLDPCCAFE	10380,{
        cutin("ep18_merchant.png", 2);
        callshop("hourly_shop", 1);
        npcshopattach("hourly_shop");
        end;
    
        OnBuyItem:
            mes("[Hourly Point Manager]");
            if (!checkweight2(@bought_nameid, @bought_quantity)) {
                mes("Sorry, you can't carry all these items!");
                close3;
            }
            
            for (.@i = 0; .@i < getarraysize(@bought_nameid); .@i++){
                .@itemIndex = inarray(.Shop, @bought_nameid[.@i]);
                .@costs += (.Shop[.@itemIndex + 1] * @bought_quantity[.@i]);
            }
    
            if (.@costs > Goldpc_Points) {
                mes("You don't have enough Hourly Points.");
                close3;
            }
    
            Goldpc_Points -= .@costs;
            for(.@i = 0; .@i < getarraysize(@bought_nameid); .@i++) {
                getitem(@bought_nameid[.@i], @bought_quantity[.@i]);
                dispbottom("Purchased " + @bought_quantity[.@i] + " x " + getitemname(@bought_nameid[.@i]) + ".");
            }
    
            mes("Purchased successfully!");
            mes("You have ^0000ff" + Goldpc_Points + "^000000 points remaining.");
            close3;
    
        OnInit:
            setarray(.Shop[0], 13534, 1, 13810, 1, 14532, 1, 14606, 1, 12211, 1, 7776, 25);
            npcshopitem("hourly_shop", 13534, 1, 13810, 1, 14532, 1, 14606, 1, 12211, 1, 7776, 25);
    }

     

    • MVP 1
  11. //===== rAthena Script ======================================= 
    //= Banker Script 
    //===== By: ================================================== 
    //= Syrus22 (1.0)
    //===== Current Version: ===================================== 
    //= 2.0
    //===== Compatible With: ===================================== 
    //= rAthena Project
    //===== Description: ========================================= 
    //= An account wide Banker to store Zeny
    //===== Additional Comments: ================================= 
    //= Syrus22 - There's an optional transaction fee at the top of
    //= the script. To use it simply change the first set command
    //= to set the cost variable to whatever you want the fee to be.
    //= Version 2.0: Optimized and brought the script up to standard. [Jguy]
    //============================================================ 
    
    verus04,174,216,5	script	Banker	109,{
    //prontera,132,217,5	script	Banker	109,{
    	mes "[Banker]";
    	mes "Welcome to the First Bank of Prontera. How can I help you today?";
    	next;
    	switch(select("I'd like to make a deposit.:I'd like to make a withdrawal.:What's my current balance?:Cancel")) {
    	case 1:
    		mes "[Banker]";
    		mes "Very well... How much would you like to deposit? The maximum you can deposit at once is ^00FF00999,999^000000 zeny.";
    		next;
    		if (.transactionFee > 0) {
    			mes "[Banker]";
    			mes "Oh, and do realize there is a ^00FF00" + .transactionFee + "^000000 zeny charge on all transactions!";
    			next;
    		}
    
    		input(.@deposit);
    		if (.@deposit < 1) {
                mes "[Banker]";
    			mes "Make sure you ask me to deposit a real amount.";
    			close;
    		}
    		
            if (.@deposit > Zeny) {
                mes "[Banker]";
    			mes "It does not appear like you have the amount of zeny you're trying to deposit!";
    			close;
    		}
    		
            if (.@deposit + .transactionFee > Zeny) {
                mes "[Banker]";
    			mes "You need ^00FF00" +.transactionFee + "^000000 Zeny to cover the transaction fee!";
    			close;
    		}
            
            if(#bankstorage + .@deposit > .maxDeposit) {
                mes "[Banker]";
    			mes "Your deposit would break the limit of ^00FF00" + .maxDeposit + "^000000 zeny!";
    			close;
            }
    
            Zeny -= .@deposit + .transactionFee;
            #bankstorage += .@deposit;
            mes "[Banker]";
            mes "Thank you very much... Your zeny is in good hands.";
            close;
    	case 2:
    		mes "[Banker]";
    		mes "Very well... How much would you like to withdraw? The maximum you can withdraw at one time is ^00FF00999,999^000000 zeny";
    		next;
    		if (.transactionFee > 0) {
    			mes "[Banker]";
    			mes "Oh, and do realize there is a ^00FF00" + .transactionFee + "^000000 zeny charge on all transactions!";
    			next;
    		}
    		input(.@withdrawal);
    		if (.@withdrawal < 1) {
    			mes "Please don't play games. I need a real amount to withdraw.";
    			close;
    		}
    		
            if (.@withdrawal > #bankstorage) {
    			mes "You only have ^00FF00" + callfunc("F_InsertComma", #bankstorage) +"^000000 zeny in your account!";
    			close;
    		}
    		
            if (.transactionFee > Zeny && .@withdrawal > .transactionFee) {
    			mes "[Banker]";
    			mes "You don't have the Zeny for the transaction fee right now. Would you like me to take the fee directly from your withdrawal?";
    			next;
    			switch(select("Yes please.:No, Thanks")) {
                    case 1:
                        mes "[Banker]";
                        mes "Removing ^00FF00" + .transactionFee + "^000000 from your withdrawal to cover the deposit fee...";
                        .@withdrawal -= .transactionFee;
                        #bankstorage -= .transactionFee;
                        next;
                        #bankstorage -= .@withdrawal;
                        Zeny += .@withdrawal;
                        mes "[Banker]";
                        mes "There's your Zeny. Have a good day.";
                        close;
                    case 2:
                        mes "[Banker]";
                        mes "Very well... come again soon.";
                        close;
    		    }
            }
    
            if(.transactionFee > Zeny) {
    			mes "[Banker]";
    			mes "You need ^00FF00" + .transactionFee + "^000000 zeny to cover the transaction fee!";
    			close;
    		}
    
            #bankstorage -= .@withdrawal;
            Zeny -= .transactionFee;
            Zeny += .@withdrawal;
            mes "[Banker]";
            mes "There's your zeny. Have a good day.";
            close;
    	case 3:
    		mes "[Banker]";
    		mes "Hmmmm... let me check some paper work.";
    		next;
    		mes "*Rustle, Rustle*";
    		next;
    		mes "[Banker]";
    		mes "You currently have ^00FF00" + callfunc("F_InsertComma", #bankstorage) + "^000000 zeny in your account.";
    		close;
    	case 4:
    		mes "[Banker]";
    		mes "Very well... come again soon.";
    		close;
    	}
    
        OnInit:
            .transactionFee = 500;
            .maxDeposit = 1000000;
    }

     

    • Upvote 1
  12. verus04,165,217,4	script	MARS_01#pa0829	4_SCR_MT_ROBOTS,{
    	disable_items;
    	if (checkweight(1201,1) == 0 || (MaxWeight - Weight) < 10000) {
    		mes "^ff0000You have carried too many items, please reduce it and come back later.^000000";
    		close;
    	}
    	switch( isbegin_quest(12368) ) {
    	case 0:
    		mes "Blurred LCD screen may be frightened or happy and intense shaking, perhaps due to lack of power and can not complete the presentation.";
    		next;
    		if (select( "Just ignore it.", "Press every button." ) == 1) {
    			mes "It may be a pre-scrap robot that is common everywhere and doesn't require much attention.";
    			close;
    		}
    		mes "[?????]";
    		mes "Hello! I'm MARS_01, an exploration robot. Currently, I have entered hibernation mode to save power. The related functions are set as follows.";
    		next;
    		if (select( "Interrupt the machine", "Supply of fuel" ) == 1) {
    			mes "The robot re-enters hibernation mode after a faint sound.";
    			close;
    		}
    		mes "[MARS_01]";
    		mes "We are super power robot, as long as the old oil 1 will let me and the companion PLUTO has more than 90% of the power.";
    		next;
    		mes "[MARS_01]";
    		mes "If you find Old Fuel, please insert the fuel into the mouth of the bottom of the screen, so you can lift the hibernation mode.";
    		setquest 12368;	// Operate the old robot
    		close;
    	case 1:
    		if (countitem(6962) < 1) {
    			mes "[MARS_01]";
    			mes "If you find 1 " + getitemname(6962) + ", please insert the fuel into the mouth of the bottom of the screen, so you can lift the hibernation mode.";
    			close;
    		}
    		mes "Maybe we ran out of power when we went looking for fuel. should we put in the fuel?";
    		next;
    		if (select( "Quit.", "Put in the fuel" ) == 1) {
    			mes "The old robot may be running out of power and not responding at all.";
    			close;
    		}
    		mes "When the fuel is put in, the sound screen opens.";
    		npctalk "Whoa, whoa?! It moves!!!", "Grandpa picking up scrap iron";
    		next;
    		mes "[MARS_01]";
    		mes "Start the inspection system and confirm the damage of each part.";
    		next;
    		mes "[MARS_01]";
    		mes "Power meter 10%, dashboard normal, body skeleton 13%, perform mining operations well.";
    		next;
    		mes "[MARS_01]";
    		mes "Pluto_09 began to inject energy for mining auxiliary robot.";
    		npctalk "Energy response confirmed. It's working.", "PLUTO_09#pa0829";
    		next;
    		mes "[MARS_01]";
    		mes "Thank you for getting me started, I will reset the person who started me to be a manager.";
    		next;
    		select("Enter a name.");
    		mes "[MARS_01]";
    		mes "" + strcharinfo(0) + ",";
    		mes "Hello! The fuel has been fully charged.";
    		delitem 6962,1;// OldTank
    		completequest 12368;
    		close;
    	case 2:
    		break;
    	}
    	mes "[MARS_01]";
    	mes "" + strcharinfo(0) + ",";
    	mes "Hello! Can I help you?";
    	next;
    	switch( select( "Note", "Enhanced " + getitemname(20773), "Enhanced " + getitemname(15128) , "Enhanced " + getitemname(28941), "Enhanced " + getitemname(22103) ) ) {	// Excelion_Wing, Excelion_Suit, Excelion_Shield, Excelion_Leg
    	case 1:
    		mes "^0000ffSoon the instructions again.^000000";
    		next;
    		mes "[MARS_01]";
    		mes "While waiting for the new owner, we continue to update to the latest version.";
    		next;
    		mes "[MARS_01]";
    		mes "If you bring aak Seri Wong propulsion wing, aak Seri Wong jacket equipment and strengthen the design, I will strengthen the equipment according to the design.";
    		next;
    		mes "[MARS_01]";
    		mes "According to the standard design drawings of the operation, the equipment will not be damaged during the process, but the number of maximum upgrade will change depending on the type of equipment.";
    		next;
    		mes "[MARS_01]";
    		mes "Welcome back again~";
    		close;
    	case 2:
    		.@part = EQI_GARMENT;
    		break;
    	case 3:
    		.@part = EQI_ARMOR;
            break;
    	case 4:
    		.@part = EQI_HAND_L;
    		break;
    	case 5:
    		.@part = EQI_SHOES;
    	}
    	// <item ID required>, <item enchant ID>, <max number of this enchant on armor>, <max number of this enchant on garment>, <max number of this enchant on shield>, <max number of this enchant on shoes>, <enchant on first slot only>
    	setarray .@list[0],
    		6965, 4970, 1, 0, 1, 1, 1,	// Reactor_P_FIRE_		Reactor_P_FIRE
    		6966, 4971, 1, 0, 1, 1, 1,	// Reactor_P_WATER_		Reactor_P_WATER
    		6967, 4972, 1, 0, 1, 1, 1,	// Reactor_P_GROUND_	Reactor_P_GROUND
    		6968, 4973, 1, 0, 1, 1, 1,	// Reactor_P_WIND_		Reactor_P_WIND
    		6969, 4974, 0, 3, 1, 1, 0,	// Reactor_T_FIRE_		Reactor_T_FIRE
    		6970, 4975, 0, 3, 1, 1, 0,	// Reactor_T_WATER_		Reactor_T_WATER
    		6971, 4976, 0, 3, 1, 1, 0,	// Reactor_T_GROUND_	Reactor_T_GROUND
    		6972, 4977, 0, 3, 1, 1, 0,	// Reactor_T_WIND_		Reactor_T_WIND
    		6973, 4978, 3, 3, 1, 1, 0,	// Reactor_Cure_101_	Reactor_Cure_101
    		6974, 4979, 3, 3, 1, 1, 0,	// Reactor_Cure_102_	Reactor_Cure_102
    		6975, 4980, 3, 3, 1, 1, 0,	// Reactor_Cure_201_	Reactor_Cure_201
    		6976, 4981, 3, 3, 1, 1, 0,	// Reactor_Cure_202_	Reactor_Cure_202
    		6977, 4982, 1, 0, 1, 1, 0,	// Reactor_A_STR_		Reactor_A_STR
    		6978, 4983, 1, 0, 1, 1, 0,	// Reactor_A_INT_		Reactor_A_INT
    		6979, 4984, 3, 3, 1, 1, 0,	// Reactor_A_DEF_		Reactor_A_DEF
    		6980, 4985, 1, 1, 1, 1, 0,	// Reactor_A_AVOI_		Reactor_A_AVOI
    		6981, 4986, 3, 3, 1, 1, 0,	// Reactor_A_ATK_		Reactor_A_ATK
    		6982, 4987, 3, 3, 1, 1, 0,	// Reactor_A_MATK_		Reactor_A_MATK
    		6983, 4988, 3, 3, 1, 1, 0,	// Reactor_A_MHP_		Reactor_A_MHP
    		6984, 4989, 3, 3, 1, 1, 0,	// Reactor_A_MSP_		Reactor_A_MSP
    		6985, 4990, 1, 0, 1, 1, 0,	// Reactor_A_FROZ_		Reactor_A_FROZ
    		6986, 4991, 1, 1, 1, 1, 0;	// Reactor_A_ASPD_		Reactor_A_ASPD
    	.@size = getarraysize(.@list);
    
    	for ( .@i = 0; .@i < .@size; .@i += 7 ) {
    		if (countitem(.@list[.@i]) < 1)
    			.@menu$ += sprintf( "^aaaaaa%s (Missing)^000000:", getitemname(.@list[.@i]) );
    		else
    			.@menu$ += sprintf( "%s:", getitemname(.@list[.@i]) );
    	}
    	mes "[MARS_01]";
    	mes "" + strcharinfo(0) + ",";
    	mes "Choose the enchant you want to use!";
    	next;
    	.@s = select("Quit.:" + .@menu$) - 2;
    	if (.@s < 0) {
    		mes "[MARS_01]";
    		mes "So far.";
    		close;
    	}
    	.@s *= 7;
    	.@item_req = .@list[.@s];
    	.@item_enchant_id = .@list[.@s+1];
    	.@first_slot_only = .@list[.@s+6];
    
    	.@equip_id = getequipid(.@part);
    	.@equip_refine = getequiprefinerycnt(.@part);
    	setarray .@card[0], getequipcardid(.@part,0), getequipcardid(.@part,1), getequipcardid(.@part,2), getequipcardid(.@part,3);
    
    	if (countitem(.@item_req) < 1) {
    		mes "[MARS_01]";
    		mes "So far.";
    		close;
    	}
    	if (.@part == EQI_ARMOR)
    		.@max_num_enchant = .@list[.@s+2];
    	else if (.@part == EQI_GARMENT)
    		.@max_num_enchant = .@list[.@s+3];
        else if (.@part == EQI_HAND_L)
    		.@max_num_enchant = .@list[.@s+4];
    	else if (.@part == EQI_SHOES)
    		.@max_num_enchant = .@list[.@s+5];
    	else {
    		mes "[MARS_01]";
    		mes "Please contact the administrator.";
    		close;
    	}
    
    	// anti-hack
    	if (callfunc("F_IsEquipIDHack", .@part, .@equip_id) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) || callfunc("F_IsEquipRefineHack", .@part, .@equip_refine)) {
    		mes "[MARS_01]";
    		mes "Did you remove your gear?";
    		close;
    	}
    
    	if (.@card[0] > 0 && .@item_enchant_id == .@card[0]) { .@slot_sum++; }
    	if (.@card[1] > 0 && .@item_enchant_id == .@card[1]) { .@slot_sum++; }
    	if (.@card[2] > 0 && .@item_enchant_id == .@card[2]) { .@slot_sum++; }
    	if (.@card[3] > 0 && .@item_enchant_id == .@card[3]) { .@slot_sum++; }
    
    	if (.@max_num_enchant < 1) {
    		mes "[MARS_01]";
    		mes "The design you choose is incompatible with the equipment.";
    		close;
    	}
    	if (.@first_slot_only > 0 && .@card[3] != 0) {
    		mes "[MARS_01]";
    		mes "This design is only for the first time to strengthen the use, but the equipment has other performance, please use other design to strengthen it!";
    		close;
    	}
    	if (.@slot_sum >= .@max_num_enchant) {
    		mes "[MARS_01]";
    		mes "The maximum number of enchants is " + .@max_num_enchant + ". The item has reached the upper limit.";
    		close;
    	}
    	if (.@card[1] != 0) {
    		mes "[MARS_01]";
    		mes "The number of equipment has reached the limit.";
    		close;
    	}
    
    	// anti-hack
    	if (callfunc("F_IsEquipIDHack", .@part, .@equip_id) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) || callfunc("F_IsEquipRefineHack", .@part, .@equip_refine)) {
    		mes "[MARS_01]";
    		mes "Please pay special attention if the equipment will be removed.";
    		close;
    	}
    
    	switch( .@equip_id ) {
    	case 20773:	// Excelion_Wing
    	case 15128:	// Excelion_Suit
        case 28941:	// Excelion Shield
        case 22103:	// Excelion Leg
    		break;
    	default:
    		mes "[MARS_01]";
    		mes "The product does not have a serial number, does not meet the specifications of the product can not be strengthened.";
    		close;
    	}
    	mes "[MARS_01]^0000ff";
    	mes "Choose " + getequipname(.@part) + " + " + getitemname(.@item_req) + ",";
    	mes "^000000------------------";
    	mes "Your selected design can be upgraded to the equipment limit ^0000ff" + .@max_num_enchant + " the same design, ^000000so far, enhanced ^0000ff" + .@slot_sum + " times^000000, do you want to continue?";
    	next;
    	if (select( "I'll think about it...", "Go on." ) == 1) {
    		mes "[MARS_01]";
    		mes "Come back next time you need me~";
    		close;
    	}
    
    	// anti-hack
    	if (callfunc("F_IsEquipIDHack", .@part, .@equip_id) || callfunc("F_IsEquipCardHack", .@part, .@card[0], .@card[1], .@card[2], .@card[3]) || callfunc("F_IsEquipRefineHack", .@part, .@equip_refine))
    		close;
    
    	if (.@card[3] == 0) {
    		.@enchant_count = 1;
    		.@card[3] = .@item_enchant_id;
    	}
    	else if (.@card[2] == 0) {
    		.@enchant_count = 2;
    		.@card[2] = .@item_enchant_id;
    	}
    	else if (.@card[1] == 0) {
    		.@enchant_count = 3;
    		.@card[1] = .@item_enchant_id;
    	}
    	else {
    		mes "[MARS_01]";
    		mes "The equipment has reached the upper limit of strengthening Hello!";
    		close;
    	}
    	specialeffect2 EF_REPAIRWEAPON;
    	mes "[MARS_01]";
    	if (.@enchant_count < 5)
    		mes "The first equipment has been upgraded ^990000" + .@enchant_count + " times^000000.";
    	else
    		mes "For additional performance equipment^990000 ^000000 upgrade.";	// never displayed
    
    	delitem .@item_req, 1;
    	delequip .@part;
    	getitem2 .@equip_id,1,1,.@equip_refine,0,.@card[0],.@card[1],.@card[2],.@card[3];
    	close;
    }

     

  13. If the ids do not have a gap between them you could do it like this:

    for(.@i = 0; .@i <= 20; .@i++) {
        .@equipId = getequipid(.@i);
    
        if(.@equipId >= 32071 && .@equipId <= 32128) {
            .@hasEquip = true;
            break;
        }
    }
    
    if(.@hasEquip == true) 
        mes "You wear a equipment with a id between 32071 and 32128";
    else
        mes "You don't wear a equipment with a id between 32071 and 32128";

    Otherwise you could put the ids into an array and loop trough the check.

  14. Hello,

    it is hard to help you, since you didn't provide the complete script. But I can give you a tip. getpartymembercount and getpartycount aren't functions.

    Later you get the number of people in the party here:
     

    set .@count, $@partymembercount;

    So you basically could move:
     

    if (getpartymembercount(getcharid(1)) != 3 && getpartycount(getcharid(1)) != 3){
    	mes "Desculpe, Você não atende o requesitos, Verifique se sua Party têm 3 pessoas e tente novamente.";
    	close;
    }

    Below above said line and change it to:
     

    if (.@count != 3){
    	mes "Desculpe, Você não atende o requesitos, Verifique se sua Party têm 3 pessoas e tente novamente.";
    	close;
    }

    To achieve what it seems you want it to do.

  15. -   script  GetRed  FAKE_NPC,{
        OnNPCKillEvent:
            #KILLED_MONSTERS += 1;
     
            if (#KILLED_MONSTERS % .mobsPerDrop != 0) end;
     
            getunitdata(killedgid, .@mobData);
            makeitem(.itemDropId, .itemDropAmt, mapid2name(.@mobData[UMOB_MAPID]), .@mobData[UMOB_X], .@mobData[UMOB_Y]);
            dispbottom "[ระบบ] : ยินดีด้วย คุณได้รับดรอปไอเทม " + getitemname(.itemDropId) + " จากการกำจัดมอนเตอร์";
        end;
     
        OnInit:
            .itemDropId = 501;
            .itemDropAmt = 1;
            .mobsPerDrop = 100;
    }
  16. Based on your packet version, your rAthena is pretty old. The current packt version is 20211103.
    The included script doesn't allow others to bail someone out. You can only bail yourself out via payment or labor.

    It also seems like it doesn't work anymore, since it doesn't really unjail you, but tries to warp you out of jail and change your savepoint which fails.
    But it might be that on your server version it still works.

    • Like 1
  17. Hello,

    I tested it on my server and I can't reproduce your error. It works fine for me.
    Which rAthena version are you using? It seems like your rAthena doesn't know the getareaunits command.

  18. 25 minutes ago, playniks said:

    Bump! How did you solve your problem bro?

    To remove the cast fixed cast time you need to edit the skill_db.yml and remove this from the asura strike entry:

        FixedCastTime:
          - Level: 1
            Time: 2000
          - Level: 2
            Time: 1750
          - Level: 3
            Time: 1500
          - Level: 4
            Time: 1250
          - Level: 5
            Time: 1000

     

  19. Hello,

    how about this?

    -	script	JailSystem#proto	FAKE_NPC,{
    	OnBail:
    		.@charCount = getareaunits(BL_PC, "sec_pri", 14, 85, 59, 65, .@charNames$);
    		mes "[Guard]";
    		if(.@charCount == 0) {
    			mes "There is no one in jail.";
    			close;
    		}
    
    		mes "Who do you want to bail out?";
    		next;
    		select(implode(.@charNames$, ":"));
    
    		mes "[Guard]";
    		mes "The fee is " + callfunc("F_InsertComma", .bailOutPrice) + "z. Do you want to pay that?";
    		next;
    		if (select("Yes:No" ) == 1) {
    			mes "[Guard]";
    			if(Zeny < .bailOutPrice) {
    				mes "It seems you don't have enough money, come back when you have enough.";
    				close;
    			}
    
    			Zeny -= .bailOutPrice;
    
    			.@addressation$ = (strcharinfo(0) == .@charNames$[@menu - 1]) ? "you" : .@charNames$[@menu - 1];
    			mes "Alright, i'll let " + .@addressation$ + " go for now.";
    			
    			close2;
    			atcommand("@unjail " + .@charNames$[@menu - 1]);
    			end;
    		}
    		
    		mes "[Guard]";
    		mes "You can come back when you change your mind.";
    		close;
    		end;
    
    	OnInit:
    		.bailOutPrice = 10000;
    }
    
    -	script	BAIL_ATCOMMAND	FAKE_NPC,{
    	OnInit:
    		bindatcmd("bail", "Guard#proto::OnBail");
    }
    
    prontera, 159, 190, 4	duplicate(JailSystem#proto)	Prison Warden#sec_pri01	4_M_YOUNGKNIGHT
    sec_pri, 18, 63, 4	duplicate(JailSystem#proto)	Jail Guard#sec_pri02	4_M_EDEN_GUARDER
    sec_pri, 45, 63, 4	duplicate(JailSystem#proto)	Jail Guard#sec_pri03	4_M_LGTGUARD

     

    • Love 1
  20. I missed a variable. This should spawn monsters now:

    -	script	EXCLUSIVE_GUILD_MAPS	FAKE_NPC,{
        OnGuildpointmobDeath:
                if ( .rate > rand( 10 ) ) {
                    .@point = rand( .guild_amount[0], .guild_amount[1] );
                    #GUILDPOINTS += .@point;
                    dispbottom "Gained " + .@point + " Point. You got "+F_InsertComma( #GUILDPOINTS ) + " Points now.";
                }
    
                callsub MobSpawn, strcharinfo(3), .respawnGPmobs;
        end;
    
        OnGoldmobDeath:
            .@r = rand(100);
            if ( .@r < 3 )
                getitem 969, 50;
            else if ( .@r < 5 )
                getitem 969, 20;
            else if ( .@r < 25 )
                getitem 969, 5;
            else if ( .@r < 50 )
                getitem 969, 3;
            else
                getitem 969, 1;
    
            callsub MobSpawn, strcharinfo(3), .respawnGoldmobs;
        end;
    
        MobSpawn:
            .@map$ = getarg(0);
    
            for(.@i = 0; .@i < getarraysize(getarg(1)); .@i += 3) {
                .@mobId = getelementofarray(getarg(1), .@i);
                .@mobType = getelementofarray(getarg(1), .@i + 1);
                .@mobAmt = getelementofarray(getarg(1), .@i + 2);
                .@mobTypeName$ = .mobTypeNames$[.@mobType];
                .@mobLabel$ =.labels$[.@mobType];
                monster .@map$, 0,0, .@mobTypeName$, .@mobId, .@mobAmt, strnpcinfo(0) + "::" + .@mobLabel$;
            }
        return;
    
        OnInit:
            //Castle Maps
            setarray .castleMaps$[0], "prtg_cas01","aldeg_cas05";
    		
    		// Exclusive Map
    		setarray .exclusiveMaps$[0], "prt_fild07","prt_fild09";
    
            // Guildpoints random amount
            setarray .guild_amount, 1, 3;
    
            // Rate to get Guildpoints
            .rate = 100;
    
    		// Mob Spawn
    		// ID, Type (0 = Gold, 1 = Guildpoints), Amount
            setarray .mobs[0],
            1369, 0, 100,
            1840, 0, 100,
            1934, 1, 50,
            1935, 1, 50;
    
    
    		// Respawn Mobs Gold
    		// ID, Type (0 = Gold, 1 = Guildpoints), Amount
            setarray .respawnGoldmobs[0],
            1369, 0, 1,
            1840, 0, 1;
    
    		// Respawn Mobs Guildpoints
    		// ID, Type (0 = Gold, 1 = Guildpoints), Amount
            setarray .respawnGPmobs[0],
            1934, 1, 1,
            1935, 1, 1;
    
            setarray .mobTypeNames$[0], "[DG]Gold", "[DG]Flower";
            setarray .labels$[0], "OnGoldmobDeath", "OnGuildpointmobDeath";
    
            for(.@i = 0; .@i < getarraysize(.exclusiveMaps$); .@i++) {
                setmapflag .exclusiveMaps$[.@i], MF_LOADEVENT;
                callsub MobSpawn, .exclusiveMaps$[.@i], .mobs;
            }
    }
    
    byako,152,144,0	script	FarmGuild	1,{
    
    	copyarray .cpyCastleMaps$[0], getvariableofnpc(.castleMaps$[0], "EXCLUSIVE_GUILD_MAPS"), getarraysize(getvariableofnpc(.castleMaps$[0], "EXCLUSIVE_GUILD_MAPS"));
    	copyarray .cpyExclusiveMaps$[0], getvariableofnpc(.exclusiveMaps$[0], "EXCLUSIVE_GUILD_MAPS"), getarraysize(getvariableofnpc(.exclusiveMaps$[0], "EXCLUSIVE_GUILD_MAPS"));
    
    	mes "[Entrance Guard]";
    	if (agitcheck() || agitcheck2() || agitcheck3()) {
    		mes "WoE is currently active you can't enter right now";
    		close;
    	}
    
        if(getcharid(2) == 0) {
    		mes "Your need to be in a Guild, for me to be able to assist you.";
    		close;
        }
    
    	.@index = 0;
    	for(.@i = 0; .@i < getarraysize(.cpyCastleMaps$); .@i++) {
    		if(getcastledata(.cpyCastleMaps$[.@i], CD_GUILD_ID) == getcharid(2)) {
    			.@ownedCastleIndexes[.@index] = .@i;
    			.@index++;
    		}
    	}
    
    	.@ownedCastlesCount = getarraysize(.@ownedCastleIndexes);
    	if (.@ownedCastlesCount == 0 && .@index == 0) {
    		mes "You don't own a Castle. Come back when you do.";
    		close;
    	}
    
    	if(.@ownedCastlesCount == 0)
    		.@map$ = .cpyExclusiveMaps$[.@ownedCastleIndexes[0]];
    
    	if(.@ownedCastlesCount > 0) {
    		for(.@i = 0; .@i < .@ownedCastlesCount; .@i++)
                .@ownedCastleNames$[.@i] = getcastlename(.cpyCastleMaps$[.@ownedCastleIndexes[.@i]]);
    
    		mes "You own multiple Castles, select to which Castles exclusive map you want to teleport.";
    		next;
    		select(implode(.@ownedCastleNames$, ":"));
    
    		.@map$ = .cpyExclusiveMaps$[.@ownedCastleIndexes[@menu - 1]];
    	}
    
    	mes "You will be warped to Lost Midgard";
    	next;
    	warp .@map$, 0, 0;
    	dispbottom "[Guild Message]: Welcome to Lost Midgard";
    	end;
    }

     

    • Upvote 1
×
×
  • Create New...