Jump to content

Mice

Members
  • Posts

    100
  • Joined

  • Last visited

  • Days Won

    9

Posts posted by Mice

  1. 4 hours ago, Racaae said:

    The 2023+ clients use new job IDs for the jRO costumes:
    JOB_RUNE_KNIGHT_2ND = 4332,
    JOB_MECHANIC_2ND = 4333,
    JOB_GUILLOTINE_CROSS_2ND = 4334,
    JOB_WARLOCK_2ND = 4335,
    JOB_ARCHBISHOP_2ND = 4336,
    JOB_RANGER_2ND = 4337,
    JOB_ROYAL_GUARD_2ND = 4338,
    JOB_GENETIC_2ND = 4339,
    JOB_SHADOW_CHASER_2ND = 4340,
    JOB_SORCERER_2ND = 4341,
    JOB_SURA_2ND = 4342,
    JOB_MINSTREL_2ND = 4343,
    JOB_WANDERER_2ND = 4344,

    You need to add them in the source. Open file \src\common\mmo.hpp. Find JOB_SKY_EMPEROR2 = 4316, then add the following code below it:

    	JOB_RUNE_KNIGHT_2ND = 4332,
    	JOB_MECHANIC_2ND,
    	JOB_GUILLOTINE_CROSS_2ND,
    	JOB_WARLOCK_2ND,
    	JOB_ARCHBISHOP_2ND,
    	JOB_RANGER_2ND,
    	JOB_ROYAL_GUARD_2ND,
    	JOB_GENETIC_2ND,
    	JOB_SHADOW_CHASER_2ND,
    	JOB_SORCERER_2ND,
    	JOB_SURA_2ND,
    	JOB_MINSTREL_2ND,
    	JOB_WANDERER_2ND,

    Save the file then recompile the server.

    I've updated the example script for you:

    // callfunc "F_JobSuit",<Job ID>;	//Change to specific sprite
    // callfunc "F_JobSuit",-1;			//Change to 2nd job
    // callfunc "F_JobSuit",-2;			//Change to transcendent 2nd job
    // callfunc "F_JobSuit",-3;			//Change to 3rd job
    // callfunc "F_JobSuit",-4;			//Change to 4th job
    // callfunc "F_JobSuit",-5;			//Change to alternative third class costume
    // callfunc "F_JobSuit";			//Return to default sprite
    
    function	script	F_JobSuit	{
    	.@block_expanded_jobs = false; //Disable changing for expanded job player (true/false)
    
    	if (getargcount() == 0) {
    		if (PACKETVER >= 20231220)
    			setlook LOOK_BODY2,Class;
    		else if (JobSuit_id > 4331 && JobSuit_id < 4345)
    			setlook LOOK_BODY2,0;
    		else
    			changebase Class;
    		JobSuit_active = false;
    		JobSuit_id = 0;
    		end;
    	}
    
    	if (getarg(0) > -1) {
    		if (jobname(getarg(0)) == "Unknown Job") {
    			dispbottom "Unknown Job";
    			end;
    		}
    		callsub S_OK,getarg(0),1;
    	}
    	if (.@block_expanded_jobs && (BaseClass == Job_Novice || BaseClass == Job_Summoner || BaseClass == Job_Gunslinger || BaseClass == Job_Ninja || BaseClass == Job_Taekwon))
    		end;
    	if (BaseClass == Job_Summoner) {
    		if (Upper) callsub S_OK,Job_Summoner;
    		else callsub S_OK,Job_Spirit_Handler;
    	}
    	else if (BaseClass == Job_Gunslinger) {
    		switch(getarg(0)) {
    			case -1: callsub S_OK,Job_Gunslinger;
    			case -2:
    			case -3: callsub S_OK,Job_Rebellion;
    			case -4:
    			case -5:
    			default: callsub S_OK,Job_Night_Watch;
    		}
    	}
    	else if (BaseClass == Job_Ninja) {
    		switch(getarg(0)) {
    			case -1: callsub S_OK,Job_Ninja;
    			case -2:
    			case -3: callsub S_OK,(Sex ? Job_Kagerou : Job_Oboro);
    			case -4:
    			case -5:
    			default: callsub S_OK,(Sex ? Job_Shinkiro : Job_Shiranui);
    		}
    	}
    	else if (BaseClass == Job_Novice) {
    		switch(getarg(0)) {
    			case -1: callsub S_OK,Job_Novice,1;
    			case -2:
    			case -3: callsub S_OK,Job_Super_Novice;
    			case -4:
    			case -5:
    			default: callsub S_OK,Job_Hyper_Novice;
    		}
    	}
    	else if (BaseJob == Job_Soul_Linker) {
    		switch(getarg(0)) {
    			case -1:
    			case -2: callsub S_OK,Job_Soul_Linker;
    			case -3: callsub S_OK,Job_Soul_Reaper;
    			case -4:
    			case -5:
    			default: callsub S_OK,Job_Soul_Ascetic;
    		}
    	}
    	else if (BaseJob == Job_Star_Gladiator) {
    		switch(getarg(0)) {
    			case -1: callsub S_OK,Job_Taekwon;
    			case -2: callsub S_OK,Job_Star_Gladiator;
    			case -3: callsub S_OK,Job_Star_Emperor;
    			case -4:
    			case -5:
    			default: callsub S_OK,Job_Sky_Emperor;
    		}
    	}
    
    	switch(getarg(0)) {
    	case -1:
    		callsub S_OK,roclass(eaclass()&EAJ_UPPERMASK);
    	case -2:
    		callsub S_OK,roclass(eaclass()&EAJ_UPPERMASK|EAJL_UPPER);
    	case -3:
    		callsub S_OK,roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD);
    	case -4:
    		.@job = roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD);
    		callsub S_OK,roclass(eaclass(.@job)|EAJL_FOURTH|EAJL_UPPER);
    	case -5:
    		.@job = roclass(eaclass()&EAJ_THIRDMASK|EAJL_THIRD);
    		if (.@job > 0)
    			callsub S_OK,roclass(eaclass(.@job)|EAJL_FOURTH|EAJL_UPPER)+80;
    	}
    
    S_OK:
    	.@c = getarg(0);
    	if (.@c < 1 && getarg(1,0) == 0) end;
    	if (PACKETVER >= 20231220)
    		setlook LOOK_BODY2,.@c;
    	else if (.@c > 4331 && .@c < 4345)
    		setlook LOOK_BODY2,1;
    	else
    		changebase .@c;
    	JobSuit_active = true;
    	JobSuit_id = .@c;
    	end;
    }
    
    -	script	#JobSuitOnLogin	-1,{	
    OnPCLoginEvent:
    	if (JobSuit_active)
    		F_JobSuit(JobSuit_id);
    	end;
    }

     

    Thank you it work perfectly

  2. 5 hours ago, Racaae said:

    Hello, I don't see the variable being set in your item script.
    You can use OnPCLoginEvent on a NPC to reapply the appearance.
    Replace changebase with setlook LOOK_BODY2.

    Example using a function:

        Script: |
          callfunc "F_JobSuit";
        UnEquipScript: |
          callfunc "F_JobSuit",-1;

     

    // callfunc "F_JobSuit";			//Change to evolution sprite
    // callfunc "F_JobSuit",<Job ID>;	//Change to specific sprite
    // callfunc "F_JobSuit",-1;			//Return to default sprite
    
    function	script	F_JobSuit	{
    	if (getarg(0,0) != -1) {
    		if (jobname(getarg(0,-1)) != "Unknown Job")
    			.@c = getarg(0);
    		else if (BaseJob == Job_Priest)
    			.@c = JOB_ARCH_BISHOP;
    		else if (BaseJob == Job_Wizard)
    			.@c = JOB_WARLOCK;
    		else if (BaseJob == Job_Blacksmith)
    			.@c = JOB_MECHANIC;
    		else if (BaseJob == Job_Hunter)
    			.@c = JOB_RANGER;
    		else if (BaseJob == Job_Assassin)
    			.@c = JOB_GUILLOTINE_CROSS;
    		else if (BaseJob == Job_Crusader)
    			.@c = JOB_ROYAL_GUARD;
    		else if (BaseJob == Job_Monk)
    			.@c = JOB_SURA;
    		else if (BaseJob == Job_Sage)
    			.@c = JOB_SORCERER;
    		else if (BaseJob == Job_Rogue)
    			.@c = JOB_SHADOW_CHASER;
    		else if (BaseJob == Job_Alchemist)
    			.@c = JOB_GENETIC;
    		else if (BaseJob == Job_Bard)
    			.@c = JOB_MINSTREL;
    		else if (BaseJob == Job_Dancer)
    			.@c = JOB_WANDERER;
    		
    		if (PACKETVER >= 20231220)
    			setlook LOOK_BODY2,.@c;
    		else
    			changebase .@c;
    		JobSuit_active = true;
    		JobSuit_id = .@c;
    		end;
    	}
    
    	if (PACKETVER >= 20231220)
    		setlook LOOK_BODY2,Class;
    	else
    		changebase Class;
    	JobSuit_active = false;
    	JobSuit_id = 0;
    	end;
    }
    
    -	script	#JobSuitOnLogin	-1,{	
    OnPCLoginEvent:
    	if (JobSuit_active)
    		F_JobSuit(JobSuit_id);
    	end;
    }

     

     

    Thank you, it's working. Now, how can I do it like that? I'm using this for a Japanese Sprite, so how can I make it work using the JRO Sprite? It worked fine with the 2022 EXE. Sorry I didn't include this information in my first post. I thought their implementation was the same.

     

        EquipScript: |
            changebase (roclass(eaclass()&EAJ_UPPERMASK)+roclass(EAJL_UPPER));
            changelook LOOK_BODY2,3;
        UnEquipScript:   |
            changelook LOOK_BODY2,0;
            changebase Class;

     

  3. Hello, I just wanted to ask about the changebase or what's known as the 3rd Job suit.
    This was working fine with the 2022 EXE, but it's no longer working with the 2023 EXE, which now uses body instead of class (also known as bodystyle).

    I checked the source for bodystyle and created a variable similar to save appearance so that when the suit is unequipped, it would work properly.

    However, the problem is that when you relog, the variable gets reset, even though it's stored in a character variable.

    Do you happen to have a different method to make it work with bodystyle?
    Here is the itemdb I'm referring to:

        Script: |
          if (BaseJob == Job_Priest)
             changebase JOB_ARCH_BISHOP;
          if (BaseJob == Job_Wizard)
             changebase JOB_WARLOCK;
          if (BaseJob == Job_Blacksmith)
             changebase JOB_MECHANIC;
          if (BaseJob == Job_Hunter)
             changebase JOB_RANGER;
          if (BaseJob == Job_Assassin)
             changebase JOB_GUILLOTINE_CROSS;
          if (BaseJob == Job_Crusader)
             changebase JOB_ROYAL_GUARD;
          if (BaseJob == Job_Monk)
             changebase JOB_SURA;
          if (BaseJob == Job_Sage)
             changebase JOB_SORCERER;
          if (BaseJob == Job_Rogue)
             changebase JOB_SHADOW_CHASER;
          if (BaseJob == Job_Alchemist)
             changebase JOB_GENETIC;
          if (BaseJob == Job_Bard)
             changebase JOB_MINSTREL;
          if (BaseJob == Job_Dancer)
             changebase JOB_WANDERER;
        UnEquipScript: |
          changebase Class;

     

  4. 8 minutes ago, StiveRO said:

    And if it's a boss ID other than the one you made, what would it be like?

    You can add this, but please note that it's already supported for all MVPs that use the tomb feature up to Renewal. It will appear as a normal tombstone, but if you have a sprite for a custom monster's dead action, you can add it to the source. The format is: {mvpID, NPCSpriteID}.

  5. MVP Tombstone Shows Boss Sprite and Name!


    Since someone is claiming that they are the only one who has the right to come up with this idea, and it's become an issue - to be honest, I didn't know that something like this had already been released here. So, I've decided to share this work for free so that everyone can benefit from it.

    Just to clarify: this is entirely my own work. I didn’t copy any code from the person claiming they are the only one entitled to ideas like this. 🙂

    As for the monster GRF, I manually edited each one to extract only the dead sprite actions.

    Whenever an MVP dies on the map, a tombstone will appear at the spot where it died — but instead of just saying "Tomb", it now shows the MVP’s name like **"Phreeoni"**, **"Baphomet"**, or **"Ifrit"**

    ✅ Instantly see which MVP was killed

    ✅ Great for MVP hunters and competitive players

    ✅ Makes the game world feel more immersive

    ✅ Works with any MVP across the server

    🎯 Example: When **Phreeoni** is defeated, a tombstone labeled **"Phreeoni"** appears where it died — no more guessing!

     


    • Submitter
    • Submitted
      06/18/25
    • Category
    • Video
      https://youtu.be/RUD2VJigr88
    • Content Author
      xJayx - A.K.A. Mice

     

    • Upvote 1
  6.  

    This is a Baccarat showcase. I saw a similar system a long time ago — it was the Thai version. A player once requested that I create something like it, so I decided to make my own version.

    Note: Baccarat is a gambling game and is strictly not allowed for minors. Only individuals 18 years old and above are permitted to play.

     

    SYSTEM MECHANICS

    This is a fully-featured Baccarat mini-game scripted in rAthena, modeled after real-world casino rules. Players place bets, watch a live NPC-based card reveal animation, and receive payouts. It includes persistent rounds, SQL-tracked wagering, crash recovery, audit trails, and anti-abuse mechanisms.

    Game Mechanics
    Baccarat Core Rules Implemented
    Two sides: Player and Banker

    Bet options:
        Player
        Banker
        Draw
        Player Pair
        Banker Pair

    Card draw rules are implemented accurately per real Baccarat regulations, including:
        Natural win (8 or 9)
        Player’s 3rd card rules
        Banker’s draw based on Player's 3rd card

    Payout System
        Player bet: 1:1
        Banker bet: 0.95:1 (5% commission)
        Draw bet: 8:1
        Pair bets: 11:1 (if first two cards of side are identical)

    Script Features
        Live Card Drawing
        Cards are drawn randomly from a 52-card deck (A–K of 4 suits).
        Each round, the system shuffles and draws up to 6 cards
            2 for Player (P1, P2), 2 for Banker (B1, B2)
            Conditional 3rd cards: P3 and/or B3

        Cards are shown using NPC representations:
            Hidden initially
            Revealed one-by-one with delays

    Round Flow
        Start of Round: Players bet on options via menu.
        Timer-based lock: Betting ends after X seconds.
        Card Draw Logic: Random cards drawn, rules evaluated.
        NPC Animation: Card NPCs display sequentially with delays.
        Payout Calculation: All player bets are evaluated and rewarded.
        Wager History Logging: All results are logged to SQL.

    Security & Reliability
        Bet Locking
            Players cannot place multiple bets in a single round.
            Betting only allowed during pre-draw phase.

    Crash Recovery
        All bets are stored database (audit log).
        On crash or server restart:
            Unprocessed bets are logged as "Refund" in Baccarat Master NPC.
            Players can manually claim their refunds via NPC.

    Persistent Tracking
        baccarat database tracks payouts with claimed flag.
        Players claim winnings from previous rounds.
        Claimed entries are logged into database history.

    Zeny Overflow Prevention
        Before giving a payout, script checks if Zeny + reward exceeds Max_Zeny.
        If exceeded, reward is withheld and player is notified.

    SQL Logging
        Full history in database
            Includes round ID, bets, results, payout, timestamp

        Used for:
            Wager audit
            Daily bet history per player
            Pagination & date filtering in NPC menu

    Card Randomization Logic
        Deck is preloaded with all 52 unique cards (e.g., AH, 2D, KC)
        A card is selected randomly and removed from the deck to avoid duplicates.
        This ensures no duplicate cards, true randomness, and integrity.

    Player Experience
        Main Menu
            Players interact with the NPC:
                Place Bet
                View Game Results (last 20 rounds)
                Check Bet History (by date)
                Claim Winnings
                View Game Rules

    Visual
        Card reveals with animation and delays
        Color-coded results:
            Banker = Red
            Player = Blue
            Draw = Green
            Pair = Marked with BP / PP

    Final Audit
        Rule-accurate Baccarat implementation
        Random, animated, NPC-based draw engine
        SQL-persistent and crash-resilient
        Security-audited with overflow protection
     

     

  7. 48 minutes ago, namerpus18 said:

    Ah! So everyone is free to copy-paste anyone's idea because we're on private server. But hey, I’m not here to argue or waste time. Just stating the obvious.

    Stop crying already. First of all, you're not the only one with a brain who can think. Second, is it really my fault if I had the same idea and acted on it? And lastly, did I even get any code from you? I didn’t even know that thing had already been released. 🙂
    If you really think your idea was stolen, you should’ve registered it with the USCO to avoid this kind of drama.
    Anyway, I'm not here to argue with you. Like I said, I didn’t know someone else already had the same idea. Then all of a sudden, you’re here crying about it—haha.

    Let’s move on, bro. You’re not the only one gifted with a brain who can come up with ideas. Let others shine too don’t act like you own all the knowledge. 🙂

    Peace, bro. Next time, if you’re working on something, make sure to register it with the USCO right away.

    • Like 1
  8. On 6/14/2025 at 7:32 PM, namerpus18 said:

    Oh, so it's been all over the forum *since January*, and you just *didn't* see it until you finished? Absolutely impeccable timing. A true masterpiece of delayed realization.

     

     

    Hello! I have no intention of competing with anyone 🙂 I actually got this idea from another player, and to be honest, I didn’t notice your post before since I wasn’t very active here until recently. I’ve only just started coming online more often.

    Anyway, I didn’t use any of your code or sprites your work is yours, and my work is mine. If the issue is just about having a similar concept, that’s not a problem for me. I mean, we’re on a private server, and the sprites we’re using aren’t even our own property.

    That’s all, really. I hope this rAthena project progresses well and that the loading issue gets resolved. I also hope to see more of your showcases I support you! 🙂

  9. 11 minutes ago, Absinthe said:

    I created a new command for the game's visual effects.
    There's already /effect, which allows us to no longer see any visual effects in the game.

    My command lets us choose which effects we no longer want to see.
    Example: "@nofx 89 on" will disable the storm gust effect.
    The command works very well. I'd like to know how to make my modifications available so that if the community finds it useful, it can be integrated into a future update.

    It would be better if you add an effect list—for example, @nofx list so that all available effects that players can disable will be displayed. Not all players know how to look up skill IDs like Storm Gust. This way, they can just use a command like /effect instead of opening a browser and searching through our Ragnarok boards for skill or effect IDs.

  10. 20 hours ago, vferrari said:

    Woah I loved it, it looks great! 😃

    Is this client side?

    Hello, this is a SRC edit and custom sprite of MVP monsters. It just uses the frame where they appear dead.

     

    18 hours ago, WhiteEagle said:

    Nice job!!
    But with a small tombstone with RIP would have more "effect" in my opinion. 😄

    This is actually a great idea adding a small tomb next to the MVP. Thanks for the suggestion!

    • Upvote 1
  11. This feature enhances the standard MVP death mechanic by replacing the generic "Tomb" label with the **actual name of the MVP** that was defeated. When an MVP dies on the map, a tombstone NPC appears at the exact spot of death, and instead of showing a generic label, it dynamically displays the **name of the boss** (e.g., "Phreeoni", "Ifrit", "Baphomet").

    🔹 **How it works for players:**
    - When an MVP is killed, a tombstone spawns on the map.
    - The tomb now shows the name of the MVP, not just “Tomb”.
    - This helps MVP hunters and players identify what boss was recently defeated, even if they arrived late.
    - It improves both visual clarity and overall immersion in the game.

    🎥 I created a demo video showcasing how this behaves in-game.

    🧠 **Note to fellow developers:**
    After completing this feature, I discovered that someone had already created a similar concept before me. However, I had no knowledge of that existing implementation during development and did not reference or use any of their code.

    This version was built independently from scratch based on how I personally wanted it to function. While the **concept is similar**, the **implementation and behavior may differ** between our versions.

    I still believe this showcases a useful quality-of-life addition for MVP-related mechanics, and I hope it can serve as inspiration or a base for others who wish to implement their own version.

    Feel free to check out the demo video and let me know your thoughts!

     

    • Upvote 1
    • Love 2
  12. 8 minutes ago, Racaae said:

    The main storage (ID 0) is the only one that's always loaded.
    Extra storages (IDs 1, 2, 3...) are only loaded when requested, and only one can be loaded at a time.
    When the code requests storage ID 2, it doesn't load fast enough, so the lines that add the item and close the storage are executed too early.
    That's why the storage remains open the first time.
    The same thing happens when the player opens another extra storage, since storage ID 2 gets switched to a different one.

    Thank you very much for your beautiful explanation. Now I understand why even if I load in clif_parse_LoadEndAck, it still doesn't work properly. It's because of that. I understand it much better now thanks to your explanation. Thank you so much. The code you provided is a big help to me. I will just use it and add a confirmation so that the storage with ID: 2 will automatically open via a script for checking in order to initialize it.

  13. 5 hours ago, Racaae said:

    Hello, change storage to premiumStorage.
    You can try my changes. I can't test it with just the code provided.

    // @autostore [Cydh]
    if (autostoring && sd->state.autostore && !item->expire_time && !id->flag.autoequip && !sd->state.storage_flag && !sd->npc_id) {
    	if ((!sd->autostore_weight || (sd->autostore_weight && get_percentage(sd->weight, sd->max_weight) >= sd->autostore_weight))
    		&& (
    			   (sd->autostore_type&1 && (id->type == IT_HEALING || id->type == IT_USABLE || id->type == IT_DELAYCONSUME || id->type == IT_CASH))
    			|| (sd->autostore_type&2 && (id->type == IT_ARMOR || id->type == IT_WEAPON || id->type == IT_SHADOWGEAR || id->type == IT_PETEGG || id->type == IT_PETARMOR))
    			|| (sd->autostore_type&4 && (id->type == IT_ETC || id->type == IT_AMMO || id->type == IT_UNKNOWN || id->type == IT_UNKNOWN2))
    			|| (sd->autostore_type&8 && id->type == IT_CARD)
    			)
    		)
    	{
    		char output[CHAT_SIZE_MAX];
    		sd->weight += w;
    		clif_updatestatus(*sd, SP_WEIGHT);
    		
    		int32 stor_id = 2; //Storage ID to autostore
    
    		if (stor_id)
    			storage_premiumStorage_load(sd, stor_id, STOR_MODE_PUT);
    		if (sd->state.storage_flag == 3) {
    			storage_storageadd(sd, &sd->premiumStorage, i, amount);
    			storage_premiumStorage_close(sd);
    		}
    		else {
    			storage_storageadd(sd, &sd->storage, i, amount);
    			storage_storageclose(sd);
    			clif_storageclose(*sd);
    		}
    
    		sprintf(output, "[ Autostore ] %dx %s", amount, id->ename.c_str());
    		clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], output, false, SELF);
    
    		achievement_update_objective(sd, AG_GET_ITEM, 1, id->value_sell);
    		return ADDITEM_SUCCESS;
    	}
    }

     

     

    Hello, it works, but there are some issues I can't figure out. Here's what's happening:

    On your first login, if you use AutoStore and pick up loot, Storage ID: 2 opens once but doesn't close. However, the item you picked up goes into your main storage instead of Storage ID: 2. After that, any new loot you pick up correctly goes into Storage ID: 2.

    But if you relog, the same issue happens again. However, if you open Storage ID: 2 first after relogging, everything works fine.

    So overall, the system works it’s just that the first opening of the storage causes the issue.

  14. Hello, this is Cydh's @autostore feature.

    // @autostore [Cydh]
    if (autostoring && sd->state.autostore && !item->expire_time && !id->flag.autoequip && !sd->state.storage_flag && !sd->npc_id) {
        if ((!sd->autostore_weight || (sd->autostore_weight && get_percentage(sd->weight, sd->max_weight) >= sd->autostore_weight))
            && (
                   (sd->autostore_type&1 && (id->type == IT_HEALING || id->type == IT_USABLE || id->type == IT_DELAYCONSUME || id->type == IT_CASH))
                || (sd->autostore_type&2 && (id->type == IT_ARMOR || id->type == IT_WEAPON || id->type == IT_SHADOWGEAR || id->type == IT_PETEGG || id->type == IT_PETARMOR))
                || (sd->autostore_type&4 && (id->type == IT_ETC || id->type == IT_AMMO || id->type == IT_UNKNOWN || id->type == IT_UNKNOWN2))
                || (sd->autostore_type&8 && id->type == IT_CARD)
                )
            )
        {
            char output[CHAT_SIZE_MAX];
            sd->weight += w;
            clif_updatestatus(*sd, SP_WEIGHT);
    
            storage_storageadd(sd, &sd->storage, i, amount);
            storage_storageclose(sd);
            clif_storageclose(*sd);
    
            sprintf(output, "[ Autostore ] %dx %s", amount, id->ename.c_str());
            clif_messagecolor(&sd->bl, color_table[COLOR_LIGHT_GREEN], output, false, SELF);
    
            achievement_update_objective(sd, AG_GET_ITEM, 1, id->value_sell);
            return ADDITEM_SUCCESS;
        }
    }
    
    ----------------------------------------------------------
    
       - ID: 2
         Name: "Storage 2"
         Table: storage2
         Max: 300
    
       - ID: 3
         Name: "Storage 3"
         Table: storage3
         Max: 300


    This is the part where it stores the item in the storage.
    storage_storageadd(sd, &sd->storage, i, amount);

    Any idea how I can call storage ID: 2 or 3 in that part, so that the item to be autostored will go to the custom storage I created?"

  15. 1 hour ago, dudol said:

    Guys sorry mejo visual learner kasi ako nahirapan ako dito https://github.com/rathena/rathena/wiki/Adding-a-Script meron bang video tutorial?

     

    1. Create your own NPC folder and *.conf file. This will make it much easier to keep track of your own scripts and can reduce the hassle when merging new revisions of rA.

    eto kasing part na to ung nalito ako, saan ako gagawa ng folder? pag iclone ung git dahil sa update hindi ba mawala ung folders ko?

    C:\Users\Tite\Desktop\Ragmanok\2.Emulator\rathena

    C:\Users\Tite\Desktop\Ragmanok\2.Emulator\rathena\npc

     

    2. Follow the basic layout of the other *.conf files and remember to import the *.conf in

    Etong mga conf files nakita ko panu daw gagawin ung import the *.conf in?

    C:\Users\Tite\Desktop\Ragmanok\2.Emulator\rathena\conf

     

    3. Panu ilagay yung NPC? na enable ko na ung gusto kong script dito scripts_custom.conf tamang section po ba ito or mali? ilipat ko nalang if ever. Salamat.

     

    nagkaroon kasi ng error sa map server din eto screenshots.

     image.png.d5a2952f8e3352da00aa14a6a3135acd.png

    image.png.2325d93dbfd640b4167eafae5c004ff7.png

     

    Hello try lang search sa youtube halos lahat ng guide ginawan na ng ating mga kasamang pinoy

     

     

    • Love 1
  16. On 12/22/2024 at 10:19 PM, ooGubAoo said:
    -	script	RandomWeaponOption	-1,{
    
     OnNPCKillEvent:
     // ตรวจสอบว่า Monster ดรอปอาวุธหรือไม่
     if (getiteminfo(killmonsterloot, 2) == 4) { // เช็คว่าของดรอปเป็นประเภทอาวุธ
     set .@weapon_id, killmonsterloot; // เก็บ Weapon ID ที่ดรอปจากมอนสเตอร์
     set .@option_rows, 1; // เริ่มต้นจำนวนแถว Option
    
     // สุ่มจำนวนแถว Option
     if (rand(100) < 50) set .@option_rows, 2; // โอกาส 50% สำหรับแถวที่ 2
     if (rand(100) < 30) set .@option_rows, 3; // โอกาส 30% สำหรับแถวที่ 3
     if (rand(100) < 10) set .@option_rows, 4; // โอกาส 10% สำหรับแถวที่ 4
    
     // ตั้งค่าตัวแปรสำหรับ Option
     setarray .@option_id[0], 0, 0, 0, 0;
     setarray .@option_value[0], 0, 0, 0, 0;
    
     // กำหนด Option ให้กับแถวที่มีโอกาสสำเร็จ
     for (set .@i, 1; .@i <= .@option_rows; set .@i, .@i + 1) {
     set .@option_id[.@i - 1], rand(4001, 4035);  // สุ่ม Option ID (ตัวอย่าง 4001-4035)
     set .@option_value[.@i - 1], rand(1, 10);    // สุ่มค่า Option (1-10)
     }
    
     // สร้างอาวุธพร้อม Option
     makeitem2 .@weapon_id, 1, getcharid(CHAR_ID_ACCOUNT), 0, 0, 
     .@option_id[0], .@option_value[0], 
     .@option_id[1], .@option_value[1], 
     .@option_id[2], .@option_value[2], 
     .@option_id[3], .@option_value[3];
     dispbottom "คุณได้รับอาวุธพร้อม Option!";
     }
     end;
    }

    It Dont Error and Dont work t

     

    Find: for (set .@i, 1; .@i <= .@option_rows; set .@i, .@i + 1) {

    Replace: for (.@i = 1; .@i <= .@option_rows; .@i++) {

     

    Find: makeitem2 .@weapon_id, 1, getcharid(CHAR_ID_ACCOUNT), 0, 0, 

    Replace: makeitem2 .@weapon_id, 1, getcharid(0), 0, 0, 

     

    Not tested

  17. 57 minutes ago, Dolphin86 said:

    This script was created originally by @Winterfox, i currently add a feature which the script will detect if player have an item before he/she can start crafting, everything was doing great and no error was shown, but somehow when the crafting process was completed i did not recive the crafted item, could someone help me what was wrong?

      Hide contents
    -	script	Armor Work Table	FAKE_NPC,{
    	.@workbench_id = atoi(strnpcinfo(2));
    
    	.@workbench_crafting_state = getd("$workbench_" + .@workbench_id + "_crafting_state");
    
    	if(.@workbench_crafting_state == 1) {
    		soundeffect "menu.wav",0;
    
    		if(countitem(.instant_craft_item_id) > 0) {
    			mes "You have an " + getitemname(.instant_craft_item_id) + ".";
    			mes "Do you want to use it to instantly finish crafting ?";
    			next;
    			if(select("Yes.:No.")) {
    				delitem(.instant_craft_item_id),1;
    				stopnpctimer;
    				goto(FINISH_CRAFTING);
    			}
    		} 
    
    		mes "Please wait until the armor crafting process is finished.";
    		close;
    	}
    
    	if(.@workbench_crafting_state == 2) {
    		FINISH_CRAFTING:
    		soundeffect "menu.wav",0;
    		mes "Here are armor.";
    		for(.@i = 0; .@i < getarraysize(getd("$workbench_" + .@workbench_id + "_products")); .@i += 2) {
    			getitem(getd("$workbench_" + .@workbench_id + "_products[" + .@i + "]"), getd("$workbench_" + .@workbench_id + "_products[" + (.@i + 1) + "]"));
    		}
    
    		delwaitingroom;
    		setd("$workbench_" + .@workbench_id + "_crafting_state", 0);
    		close;
    	}
    //=======================================================
    	if(countitem(40040) == 1) {
    	callsub(Start_Armor);
    	}
    	soundeffect "menu.wav",0;
    	mes "You will need Armor Crafting Tier 2";
    	mes "or above.";
    	close;
    	
    Start_Armor:
    	deletearray(@product_recipe, getarraysize(@product_recipe));
    	soundeffect "menu.wav",0;
    	mes "^ff0000==============================";
    	mes "Any item created unattended by using the Public armor can be stolen by other players!";
    	mes "==============================^000000";
    	next;
    	soundeffect "menu.wav",0;
    	mes "^ff0000==============================";
    	mes "Private armor are shared with those who have acsess only!";
    	mes "==============================^000000";
    	next;
    	soundeffect "menu.wav",0;
    	mes "Select Armor Crafting.";
    	switch(select("- Normal Armor")){
    		case 1:
    			clear;
    			soundeffect "menu.wav",0;
    			mes "Select Tools";
    			switch(select("- Stone Knife")){
    				case 1:
    					clear;
    					soundeffect "menu.wav",0;
    					mes "Select Armor Location.";
    					switch(select("- Upper:- Middle")){
    						case 1:
    							setarray(@product_recipe, 40117, 1, 40005, 1, 1, 40115, 0, 1, 40166, 0, 1);
    							break;
    						case 2:
    							setarray(@product_recipe, 40119, 1, 40005, 1, 1, 40115, 0, 1, 40166, 0, 1);
    							break;
    					}
    			}
    	}
    //=====================================================================================
    	if(getarraysize(@product_recipe) == 0) {
    		end;
    	}
    
    	.@product_id = @product_recipe[0];
    	.@product_amount = @product_recipe[1];
    
    	for(.@i = 2; .@i < getarraysize(@product_recipe); .@i += 3) {
    		.@next_start_index = getarraysize(.@product_requirements);
    
    		.@product_requirements[.@next_start_index] = @product_recipe[.@i];
    		.@product_requirements[.@next_start_index + 1] = @product_recipe[.@i + 1];
    		.@product_requirements[.@next_start_index + 2] = @product_recipe[.@i + 2];
    	}
    
    	clear;
    	soundeffect "menu.wav",0;
    	mes "Require";
    	for(.@i = 0; .@i < getarraysize(.@product_requirements); .@i += 3) {
    		if(.@product_requirements[.@i + 1] == 1) {
    			.@item_amount = rentalcountitem(.@product_requirements[.@i]);
    		} else {
    			.@item_amount = countitem(.@product_requirements[.@i]);
    		}
    
    		.@item_requirement_text$ = .@product_requirements[.@i + 2] + " " + getitemname(.@product_requirements[.@i]);
    		if(.@item_amount < .@product_requirements[.@i + 2]) {
    			.@not_enough_items = 1;
    
    			mes "^ff0000- " + .@item_requirement_text$ + "^000000";
    		} else {
    			mes "^8fce00- " + .@item_requirement_text$ + "^000000";
    		}
    	}
    
    	if(.@not_enough_items == 1) {
    		close;
    	}
    
    	soundeffect "menu.wav",0;
    	select("- Start");
    
    	if(countitem(40040) == 1) {
    		armor_points += 1;
    		dispbottom("Gained +1 Armor Crafting Points");
    	}
    
    	for(.@i = 0; .@i < getarraysize(.@product_requirements); .@i += 3) {
    		if(.@product_requirements[.@i + 1] == 0) {
    			delitem(.@product_requirements[.@i], .@product_requirements[.@i + 2]);
    		}
    	}
    
    	setarray(getd("$workbench_" + .@workbench_id + "_products"), .@product_id, .@product_amount);
    	setd("$workbench_" + .@workbench_id + "_crafting_state", 1);
    
    	clear;
    	mes "The crafting armor process has started, please wait until it is finished.";
    
    	OnCraftingStart:
    		waitingroom("CRAFTING...", 0);
    		initnpctimer;
    		end;
    
    	OnTimer60000:
    		setd("$workbench_" + atoi(strnpcinfo(2)) + "_crafting_state", 2);
    		delwaitingroom;
    		waitingroom("COMPLETED!", 0);
    		end;
    
    	OnInit:
    		.@workbench_id = atoi(strnpcinfo(2));
    		if(.@workbench_id < 1) {
    			.instant_craft_item_id = 40014;
    			end;
    		}
    
    		if(getd("$workbench_" + .@workbench_id + "_crafting_state") == 1) {
    			goto(OnCraftingStart);
    		}
    		end;
    //=============================================================================
    }
    //Duplicate
    //=====================================================
    //new_1-3,91,143,6	duplicate(Armor Work Table)	Public Armor Work Table#9000	11004
    //new_1-3,95,143,6	duplicate(Armor Work Table)	Public Armor Work Table#9001	11004
    //new_1-3,99,143,6	duplicate(Armor Work Table)	Public Armor Work Table#9002	11004
    //new_1-3,91,149,6	duplicate(Armor Work Table)	Public Armor Work Table#9003	11004
    
    
    //veil
    //=====================================================
    veil,135,45,6	duplicate(Armor Work Table)	Public Armor Work Table#9004	11004
    veil,140,45,6	duplicate(Armor Work Table)	Public Armor Work Table#9005	11004
    veil,145,45,6	duplicate(Armor Work Table)	Public Armor Work Table#9006	11004
    veil,150,45,6	duplicate(Armor Work Table)	Public Armor Work Table#9007	11004
    
    veil,135,41,6	duplicate(Armor Work Table)	Public Armor Work Table#9008	11004
    veil,140,41,6	duplicate(Armor Work Table)	Public Armor Work Table#9009	11004
    veil,145,41,6	duplicate(Armor Work Table)	Public Armor Work Table#9010	11004
    veil,150,41,6	duplicate(Armor Work Table)	Public Armor Work Table#9011	11004
    
    veil,135,37,6	duplicate(Armor Work Table)	Public Armor Work Table#9012	11004
    veil,140,37,6	duplicate(Armor Work Table)	Public Armor Work Table#9013	11004
    veil,145,37,6	duplicate(Armor Work Table)	Public Armor Work Table#9014	11004
    veil,150,37,6	duplicate(Armor Work Table)	Public Armor Work Table#9015	11004
    
    veil,145,33,6	duplicate(Armor Work Table)	Public Armor Work Table#9016	11004
    veil,150,33,6	duplicate(Armor Work Table)	Public Armor Work Table#9017	11004
    veil,145,29,6	duplicate(Armor Work Table)	Public Armor Work Table#9018	11004
    veil,150,29,6	duplicate(Armor Work Table)	Public Armor Work Table#9019	11004
    //veil,223,55,6	duplicate(Armor Work Table)	Public Armor Work Table#9020	11004
    //veil,208,55,6	duplicate(Armor Work Table)	Public Armor Work Table#9021	11004
    
    //new_1-3,95,149,6	duplicate(Armor Work Table)	Public Armor Work Table#9022	11004
    //new_1-3,99,149,6	duplicate(Armor Work Table)	Public Armor Work Table#9023	11004
    
    //island
    //===============================================================
    neko1,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9024	11004
    neko1,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9025	11004
    neko1,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9026	11004
    neko1,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9027	11004
    
    //===============================================================
    neko2,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9030	11004
    neko2,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9031	11004
    neko2,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9032	11004
    neko2,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9033	11004
    
    //===============================================================
    neko3,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9036	11004
    neko3,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9037	11004
    neko3,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9038	11004
    neko3,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9039	11004
    
    //===============================================================
    neko4,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9042	11004
    neko4,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9043	11004
    neko4,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9044	11004
    neko4,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9045	11004
    
    //===============================================================
    neko5,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9048	11004
    neko5,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9049	11004
    neko5,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9050	11004
    neko5,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9051	11004
    
    //===============================================================
    neko6,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9054	11004
    neko6,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9055	11004
    neko6,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9056	11004
    neko6,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9057	11004
    
    //==============================================================
    neko7,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9060	11004
    neko7,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9061	11004
    neko7,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9062	11004
    neko7,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9063	11004
    
    //===============================================================
    neko8,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9066	11004
    neko8,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9067	11004
    neko8,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9068	11004
    neko8,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9069	11004
    
    //===============================================================
    neko9,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9072	11004
    neko9,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9073	11004
    neko9,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9074	11004
    neko9,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9075	11004
    
    //==============================================================
    neko10,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9078	11004
    neko10,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9079	11004
    neko10,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9080	11004
    neko10,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9081	11004
    
    //===============================================================
    neko11,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9084	11004
    neko11,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9085	11004
    neko11,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9086	11004
    neko11,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9087	11004
    
    //===============================================================
    neko12,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9090	11004
    neko12,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9091	11004
    neko12,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9092	11004
    neko12,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9093	11004
    
    //===============================================================
    neko13,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9096	11004
    neko13,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9097	11004
    neko13,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9098	11004
    neko13,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9099	11004
    
    //===============================================================
    neko14,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9102	11004
    neko14,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9103	11004
    neko14,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9104	11004
    neko14,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9105	11004
    
    //===============================================================
    neko15,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9108	11004
    neko15,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9109	11004
    neko15,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9110	11004
    neko15,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9111	11004
    
    //===============================================================
    neko16,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9114	11004
    neko16,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9115	11004
    neko16,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9116	11004
    neko16,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9117	11004
    
    //===============================================================
    neko17,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9120	11004
    neko17,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9121	11004
    neko17,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9122	11004
    neko17,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9123	11004
    
    //===============================================================
    neko18,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9126	11004
    neko18,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9127	11004
    neko18,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9128	11004
    neko18,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9129	11004
    
    //===============================================================
    neko19,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9132	11004
    neko19,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9133	11004
    neko19,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9134	11004
    neko19,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9135	11004
    
    //===============================================================
    neko20,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9138	11004
    neko20,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9139	11004
    neko20,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9140	11004
    neko20,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9141	11004
    
    //===============================================================
    neko21,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9144	11004
    neko21,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9145	11004
    neko21,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9146	11004
    neko21,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9147	11004
    
    //===============================================================
    neko22,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9150	11004
    neko22,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9151	11004
    neko22,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9152	11004
    neko22,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9153	11004
    
    //===============================================================
    neko23,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9156	11004
    neko23,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9157	11004
    neko23,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9158	11004
    neko23,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9159	11004
    
    //===============================================================
    neko24,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9162	11004
    neko24,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9163	11004
    neko24,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9164	11004
    neko24,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9165	11004
    
    //===============================================================
    neko25,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9168	11004
    neko25,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9169	11004
    neko25,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9170	11004
    neko25,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9171	11004
    
    //===============================================================
    neko26,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9174	11004
    neko26,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9175	11004
    neko26,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9176	11004
    neko26,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9177	11004
    
    //===============================================================
    neko27,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9180	11004
    neko27,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9181	11004
    neko27,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9182	11004
    neko27,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9183	11004
    
    //===============================================================
    neko28,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9186	11004
    neko28,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9187	11004
    neko28,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9188	11004
    neko28,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9189	11004
    
    //===============================================================
    neko29,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9192	11004
    neko29,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9193	11004
    neko29,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9194	11004
    neko29,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9195	11004
    
    //===============================================================
    neko30,77,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9198	11004
    neko30,81,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9199	11004
    neko30,85,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9200	11004
    neko30,89,136,6	duplicate(Armor Work Table)	Private Armor Work Table#9201	11004
    
    

     

    Thank You..

    What is the error in the map server after completing the quest and not receiving the reward?

  18. 6 hours ago, Yukaiii said:

    Good morning guys!
    Could anyone help me with this script?
    I wanted it to announce when the player opened the box and the item was won

     

    I even tried a few ways here but without success.
    I am using eAthena emulator.

     

     

     

    Try it like this

    case 0:    getitem2 5100,1,1,0,0,0,0,0,0; announce "Player has received a reward!",0; break;

     

×
×
  • Create New...