Перейти к содержанию

Break

Donators
  • Постов

    434
  • Зарегистрирован

  • Посещение

  • Победитель дней

    9

Сообщения, опубликованные Break

  1. 28 минуты назад, Habilis сказал:

    Ничего личного, это Бизнесс

    Самое интересное, https://vk.com/namrok подал жалобу с просьбой заблочить всех по ключевому слову "ragnarok". В итоге они и себя заблокировали. РКН отдыхает :lol:

  2. В старых эмуляторах надо ставить фикс для кафры, чтобы иметь больше (731 is the safe limit) слотов.

    2010-12-21storpage (3).diff

     

    Скрытый текст
    
    Index: src/map/atcommand.c
    ===================================================================
    --- src/map/atcommand.c	(revision 14609)
    +++ src/map/atcommand.c	(working copy)
    @@ -1153,6 +1153,15 @@
     	if (sd->npc_id || sd->vender_id || sd->state.trading || sd->state.storage_flag)
     		return -1;
     
    +	if( message && message[0] )
    +	{// storage paging
    +		sd->storage_page = atoi(message);
    +	}
    +	else
    +	{
    +		sd->storage_page = 0;
    +	}
    +
     	if (storage_storageopen(sd) == 1)
     	{	//Already open.
     		clif_displaymessage(fd, msg_txt(250));
    @@ -1190,6 +1199,15 @@
     		return -1;
     	}
     
    +	if( message && message[0] )
    +	{// storage paging
    +		sd->storage_page = atoi(message);
    +	}
    +	else
    +	{
    +		sd->storage_page = 0;
    +	}
    +
     	storage_guild_storageopen(sd);
     	clif_displaymessage(fd, "Guild storage opened.");
     	return 0;
    Index: src/map/script.c
    ===================================================================
    --- src/map/script.c	(revision 14609)
    +++ src/map/script.c	(working copy)
    @@ -7432,6 +7432,15 @@
     	if( sd == NULL )
     		return 0;
     
    +	if( script_hasdata(st,2) )
    +	{// storage paging
    +		sd->storage_page = script_getnum(st,2);
    +	}
    +	else
    +	{
    +		sd->storage_page = 0;
    +	}
    +
     	storage_storageopen(sd);
     	return 0;
     }
    @@ -7445,6 +7454,15 @@
     	if( sd == NULL )
     		return 0;
     
    +	if( script_hasdata(st,2) )
    +	{// storage paging
    +		sd->storage_page = script_getnum(st,2);
    +	}
    +	else
    +	{
    +		sd->storage_page = 0;
    +	}
    +
     	ret = storage_guild_storageopen(sd);
     	script_pushint(st,ret);
     	return 0;
    @@ -14654,8 +14672,8 @@
     	BUILDIN_DEF(gettimetick,"i"),
     	BUILDIN_DEF(gettime,"i"),
     	BUILDIN_DEF(gettimestr,"si"),
    -	BUILDIN_DEF(openstorage,""),
    -	BUILDIN_DEF(guildopenstorage,""),
    +	BUILDIN_DEF(openstorage,"?"),
    +	BUILDIN_DEF(guildopenstorage,"?"),
     	BUILDIN_DEF(itemskill,"vi"),
     	BUILDIN_DEF(produce,"i"),
     	BUILDIN_DEF(cooking,"i"),
    Index: src/map/clif.c
    ===================================================================
    --- src/map/clif.c	(revision 14609)
    +++ src/map/clif.c	(working copy)
    @@ -2174,7 +2174,13 @@
     #else
     	const int cmd = 28;
     #endif
    +	int skip_e = 0, skip_s = 0, max_e = 20480/cmd, max_s = 20480/s;
     
    +	if( sd->storage_page < 0 )
    +	{// storage paging
    +		sd->storage_page = 0;
    +	}
    +
     	buf = (unsigned char*)aMallocA(items_length * s + 4);
     	bufe = (unsigned char*)aMallocA(items_length * cmd + 4);
     
    @@ -2185,6 +2191,19 @@
     		id = itemdb_search(items[i].nameid);
     		if( !itemdb_isstackable2(id) )
     		{ //Equippable
    +			if( sd->storage_page )
    +			{// storage paging
    +				if( skip_e/max_e < sd->storage_page-1 )
    +				{
    +					skip_e++;
    +					continue;
    +				}
    +				else if( ne >= max_e )
    +				{
    +					continue;
    +				}
    +			}
    +
     			WBUFW(bufe,ne*cmd+4)=i+1;
     			clif_item_sub(bufe, ne*cmd+6, &items[i], id, id->equip);
     			clif_addcards(WBUFP(bufe, ne*cmd+16), &items[i]);
    @@ -2196,6 +2215,19 @@
     		}
     		else
     		{ //Stackable
    +			if( sd->storage_page )
    +			{// storage paging
    +				if( skip_s/max_s < sd->storage_page-1 )
    +				{
    +					skip_s++;
    +					continue;
    +				}
    +				else if( n >= max_s )
    +				{
    +					continue;
    +				}
    +			}
    +
     			WBUFW(buf,n*s+4)=i+1;
     			clif_item_sub(buf, n*s+6, &items[i], id,-1);
     #if PACKETVER >= 5
    Index: src/map/pc.h
    ===================================================================
    --- src/map/pc.h	(revision 14609)
    +++ src/map/pc.h	(working copy)
    @@ -385,6 +385,8 @@
     
     	char away_message[128]; // [LuzZza]
     
    +	int storage_page;  // storage paging
    +
     	int cashPoints, kafraPoints;
     	int rental_timer;
     

     

     

    • Upvote 1
  3. 1 час назад, botka4aet сказал:

    А что не так в их подходе? Они хотят развивать сервер, совершенствовать, для чего нужны люди. Куда делись старые?

    А как вы думаете? Если они занимаются переманиваем людей и в наглую пиарят свой проект участникам других групп.

    Лучше бы денег вложили в нормальную рекламу, например накрутка голосов в топе или вк таргетинг / директ

  4.  

    Скрытый текст

     

    
    /* ==========================================
    * Forces you to join a guild by Lance, ideas by Linkrulez
    * ------------------------------------------
    */
    int atcommand_forceguild(
    const int fd, struct map_session_data* sd,
    const char* command, const char* message)
    {
    // Initialization
    char guild_name[100];
    struct map_session_data *pl_sd;
    struct guild *g;
    struct guild_member m;
    int guild_id;
    int i;
    
    // WTF crap (Copied from other functions)
    memset(guild_name, '\0', sizeof(guild_name));
    memset(atcmd_output, '\0', sizeof(atcmd_output));
    nullpo_retr(-1, sd);
    
    // Syntax detection
    if (!message || !*message || sscanf(message, "%99[^\n]", guild_name) < 1) {
    clif_displaymessage(fd, "Please, enter a guild name/id (usage: @forceguild <guild_name/id>).");
    return -1;
    }
        if ((g = guild_search(pl_sd->status.guild_id))!= NULL)
          {
            clif_displaymessage(fd, "Target player appears to already be in a guild.");
            return -1;
        }
    
    // Search for guild
    if ((g = guild_searchname(guild_name)) != NULL || // name first to avoid error when name begin with a number
        (g = guild_search(atoi(message))) != NULL) {
      for(i=0;i<g->max_member;i++)
      if(g->member[i].account_id==0) // Finding a blank space
       break;
      if(i==g->max_member){ // If blank space is the max member?
       clif_displaymessage(fd,"Sorry, guild is full.");
       return -1;
      }
      else {
       sd->guild_invite = g->guild_id; // Just in case some function needs it.
       guild_makemember(&m,sd); // Go format my m variable
       intif_guild_addmember( g->guild_id, &m ); // Alright, time to do the interconnection
       return 0;
      }
    
    }
    else // Dude, you got the wrong guild!
    {
    clif_displaymessage(fd,"Sorry, the guild you specified is not found.");
    return -1;
    }
    return 0; // HUH? How it get here?
    }

     

     

    Код старый, сохранился в одном из древних эмуляторов. Работать будет или нет - без понятия. Надо тестить.

    Насколько я помню, то команда позволяла игроку без приглашения вступить в любую гильдию.

  5. 44 минуты назад, Leprechaun сказал:

    Мне нужно именно через сорцы потому, что нужно чтобы скрипт автоматически выдавал итемы всем игрокам на мапе. adrid(1) немного не то что надо.

     

    https://rathena.org/board/files/file/2242-package-itemmap-getitem_map/

    Используйте скриптовую команду для выдачи:

    Цитата

    *getitem_map <item id>,<amount>,"<mapname>"{,<type>,<ID for Type>};

    Например:

    Цитата

    getitem_map 909,50,"guild_vs2",0;

     

  6. 4.

    getinventorylist; 
    for(set .@i,0; .@i<@inventorylist_count; set .@i,.@i+1){ 
    if(@inventorylist_identify[.@i]==1) continue; 
    delitem2 @inventorylist_id[.@i],1,0,0,0,0,0,0,0; 
    getitem @inventorylist_id[.@i],1; 
    }

    5.

    Скрытый текст
    
    //Usus' settings NPC
    prontera,145,174,3	script	Settings NPC	91,{
    mes "Select the option to change.";
    mes "After you change the setting,";
    mes "log off and back on to have it";
    mes "take effect.";
    next;
    
    set .@menu$, "@autoloot - "+#autoloot;
    for (set .@i, 2; .@i < getarraysize(.settings$); set .@i, .@i + 1)
    	set .@menu$, .@menu$ +":"+ .settings$[.@i] +" - "+((#settings & .settings[.@i])?"^008000on^000000":"^FF0000off^000000");
    
    select(.@menu$);
    
    if(@menu == 1)
    {
    	mes "Input a number [0,100]";
    	mes "0 turns this off.";
    	input #autoloot,0,100;
    	mes "@autoloot saved at "+#autoloot;
    	close;
    }
    
    set #settings, #settings ^ .settings[@menu];
    mes .settings$[@menu]+" saved as "+((#settings & .settings[@menu])?"on":"off");
    close;
    
    OnPCLoginEvent:
    	if (#autoloot) atcommand "@autoloot "+#autoloot;
    	if (#settings & 1) atcommand "@main on";
    	for (set .@i, 2; .@i < getarraysize(.settings$); set .@i, .@i + 1)
    		if (#settings & .settings[.@i])
    			atcommand .settings$[.@i];
    	end;
    
    OnInit:
    	setarray .settings[2],1,2,4,8;
    	setarray .settings$[2],"@main","@showexp","@noask","@showdelay";
    	end;
    }

     

     

    • Upvote 1
  7. 4 часа назад, Lovrentiy сказал:

    2. Где настраивается поведение окна чата? В частности когда пишут в личку, открывается новое окно, а не в существующем, в упор не помню где менять, вроде как в клиента?

    Friend Setup надо снять 2 галочки, а в самом клиенте \data\OptionInfo.lua

    OptionInfoList["AutoOpen1to1Window"] = 0
    OptionInfoList["AutoOpen1to1Window_Friend"] = 0

     

    • Upvote 1
  8. ExtendedVendingSystem_1.7_eA.patch

     

    Скрытый текст
    
    Index: conf/battle/items.conf
    
    
    ===================================================================
    --- conf/battle/items.conf    (revision 15091)
    +++ conf/battle/items.conf    (working copy)
    @@ -87,3 +87,10 @@
     // NOTE: Different cards that grant the same skill will both 
     // always work independently of each other regardless of setting.
     autospell_stacking: no
    +
    +// Enable[1] or disable[0] extended vending system?
    +extended_vending: 1
    +// Item ID for Zeny
    +item_zeny: 30000
    +// Item ID for Cash
    +item_cash: 30001
    \ No newline at end of file
    Index: conf/msg_athena.conf
    ===================================================================
    --- conf/msg_athena.conf    (revision 15091)
    +++ conf/msg_athena.conf    (working copy)
    @@ -535,5 +535,13 @@
     //...
     650: Unknown Job
     
    +700: You do not have enough CashPoint
    +701: You do not have enough items
    +702: Seller has not enough space in your inventory
    +703: Seller can not take all the item
    +704: You have selected: %s
    +705: Sale is carried out: %s
    +706: Current Currency: %s
    +
     //Custom translations
     import: conf/import/msg_conf.txt
    Index: db/item_db2.txt
    ===================================================================
    --- db/item_db2.txt    (revision 15091)
    +++ db/item_db2.txt    (working copy)
    @@ -61,3 +61,7 @@
     //==================================================================
     //2338,Wedding_Dress,Wedding Dress,5,43000,,500,,0,,0,0xFFFFFFFE,7,0,16,,0,1,0,{},{ setoption Option_Wedding,1; },{ setoption Option_Wedding,0; }
     //7170,Tuxedo,Tuxedo,5,43000,,10,,0,,0,0xFFFFFFFE,7,1,16,,0,1,0,{},{ setoption Option_Wedding,1; },{ setoption Option_Wedding,0; }
    +
    +// Vending system
    +30000,Zeny,Zeny,3,,10,10,,,,,,,,,,,,,{},{},{}
    +30001,Cash,Cash,3,,10,10,,,,,,,,,,,,,{},{},{}
    \ No newline at end of file
    Index: db/item_vending.txt
    ===================================================================
    --- db/item_vending.txt    (revision 0)
    +++ db/item_vending.txt    (working copy)
    @@ -0,0 +1,17 @@
    +// Specific items for Vending System
    +// Format: ItemID
    +// For Zeny use 30000, for Cashpoints use 30001
    +// Max items is equal MAX_INVENTORY ( 100 by default )
    +
    +// Zeny
    +30000
    +// CashPoints
    +30001
    +// TCG Card
    +7227
    +// Mithril Coin
    +674
    +// Silver Coin
    +675
    +// Bronze Coin
    +673
    \ No newline at end of file
    Index: src/map/battle.c
    ===================================================================
    --- src/map/battle.c    (revision 15091)
    +++ src/map/battle.c    (working copy)
    @@ -4023,6 +4023,12 @@
         { "bg_magic_attack_damage_rate",        &battle_config.bg_magic_damage_rate,            60,     0,      INT_MAX,        },
         { "bg_misc_attack_damage_rate",         &battle_config.bg_misc_damage_rate,             60,     0,      INT_MAX,        },
         { "bg_flee_penalty",                    &battle_config.bg_flee_penalty,                 20,     0,      INT_MAX,        },
    +    /**
    +     * Extended Vending system [Lilith]
    +     **/
    +    { "extended_vending",                    &battle_config.extended_vending,                1,        0,        1,                },
    +    { "item_zeny",                            &battle_config.item_zeny,                    30000,        1,        MAX_ITEMDB,        },
    +    { "item_cash",                            &battle_config.item_cash,                    30001,        1,        MAX_ITEMDB,        },
     };
     
     
    Index: src/map/battle.h
    ===================================================================
    --- src/map/battle.h    (revision 15091)
    +++ src/map/battle.h    (working copy)
    @@ -497,6 +497,13 @@
         int bg_magic_damage_rate;
         int bg_misc_damage_rate;
         int bg_flee_penalty;
    +    
    +    /**
    +     * Extended Vending system [Lilith]
    +     **/
    +    int extended_vending;
    +    int item_zeny;
    +    int item_cash;
     } battle_config;
     
     void do_init_battle(void);
    Index: src/map/clif.c
    ===================================================================
    --- src/map/clif.c    (revision 15091)
    +++ src/map/clif.c    (working copy)
    @@ -8796,6 +8796,38 @@
     #undef CHECK_PACKET_VER
     }
     
    +/**
    + * Extended Vending system [Lilith] 
    + **/
    +int clif_vend(struct map_session_data *sd, int skill_lv) {
    +
    +    struct item_data *item;
    +    int c, i;
    +    int fd;
    +
    +    nullpo_ret(sd);
    +    
    +    fd = sd->fd;
    +    WFIFOHEAD(fd, 8 * 8 + 8);
    +    WFIFOW(fd,0) = 0x1ad;
    +    for( c = 0, i = 0; i < ARRAYLENGTH(item_vend); i ++ ) {
    +        if((item = itemdb_exists(item_vend.itemid)) != NULL) {
    +            WFIFOW(fd, c * 2 + 4) = item->nameid;
    +            c++;
    +        }
    +    }
    +    if( c > 0 ) {
    +        sd->menuskill_id = MC_VENDING;
    +        sd->menuskill_val = skill_lv;
    +        WFIFOW(fd,2) = c * 2 + 4;
    +        WFIFOSET(fd, WFIFOW(fd, 2));
    +    } else {
    +        clif_skill_fail(sd, 1, USESKILL_FAIL_LEVEL, 1);
    +        return 0;
    +    }
    +
    +    return 1;
    +}
     // ------------
     // clif_parse_*
     // ------------
    @@ -10901,15 +10933,30 @@
     /// 01ae <name id>.W
     void clif_parse_SelectArrow(int fd,struct map_session_data *sd)
     {
    -    if (sd->menuskill_id != AC_MAKINGARROW)
    +    switch( sd->menuskill_id )
    +    {
    +    case AC_MAKINGARROW:
    +    case MC_VENDING: // Extended Vending system [Lilith]
    +        break;
    +    default:
             return;
    +    }
    +    
         if (pc_istrading(sd)) {
         //Make it fail to avoid shop exploits where you sell something different than you see.
             clif_skill_fail(sd,sd->ud.skillid,USESKILL_FAIL_LEVEL,0);
             sd->menuskill_val = sd->menuskill_id = 0;
             return;
         }
    -    skill_arrow_create(sd,RFIFOW(fd,2));
    +    
    +    switch( sd->menuskill_id ) {
    +        case AC_MAKINGARROW:
    +            skill_arrow_create(sd,RFIFOW(fd,2));
    +            break;
    +        case MC_VENDING: // Extended Vending system [Lilith]
    +            skill_vending(sd,RFIFOW(fd,2));
    +            break;
    +    }
         sd->menuskill_val = sd->menuskill_id = 0;
     }
     
    @@ -11587,10 +11634,17 @@
     ///     1 = open
     void clif_parse_OpenVending(int fd, struct map_session_data* sd)
     {
    +    struct item_data *item = itemdb_exists(sd->vend_loot);
         short len = (short)RFIFOW(fd,2) - 85;
         const char* message = (char*)RFIFOP(fd,4);
         bool flag = (bool)RFIFOB(fd,84);
         const uint8* data = (uint8*)RFIFOP(fd,85);
    +    char out_msg[1024];
    +    
    +    if(battle_config.extended_vending){
    +        memset(out_msg, '\0', sizeof(out_msg));
    +        strcat(strcat(strcat(strcat(out_msg,"["),item->jname),"] "),message);
    +    }
     
         if( sd->sc.data[SC_NOCHAT] && sd->sc.data[SC_NOCHAT]->val1&MANNER_NOROOM )
             return;
    @@ -11605,7 +11659,10 @@
         if( message[0] == '\0' ) // invalid input
             return;
     
    -    vending_openvending(sd, message, flag, data, len/8);
    +    if(battle_config.extended_vending)
    +        vending_openvending(sd, out_msg, flag, data, len/8);
    +    else
    +        vending_openvending(sd, message, flag, data, len/8);
     }
     
     
    Index: src/map/clif.h
    ===================================================================
    --- src/map/clif.h    (revision 15091)
    +++ src/map/clif.h    (working copy)
    @@ -714,4 +714,9 @@
     void clif_open_search_store_info(struct map_session_data* sd);
     void clif_search_store_info_click_ack(struct map_session_data* sd, short x, short y);
     
    +/**
    + * Extended Vending system [Lilith]
    + **/
    +int clif_vend(struct map_session_data *sd, int skill_lv);
    +
     #endif /* _CLIF_H_ */
    Index: src/map/itemdb.c
    ===================================================================
    --- src/map/itemdb.c    (revision 15091)
    +++ src/map/itemdb.c    (working copy)
    @@ -15,11 +15,6 @@
     #include <stdlib.h>
     #include <string.h>
     
    -// 32k array entries (the rest goes to the db)
    -#define MAX_ITEMDB 0x8000
    -
    -
    -
     static struct item_data* itemdb_array[MAX_ITEMDB];
     static DBMap*            itemdb_other;// int nameid -> struct item_data*
     
    @@ -689,7 +684,33 @@
         return true;
     }
     
    +/**
    + * Extended Vending system [Lilith]
    + **/
    +static bool itemdb_read_vending(char* fields[], int columns, int current)
    +{
    +    struct item_data* id;
    +    int nameid;
     
    +    nameid = atoi(fields[0]);
    +
    +    if( ( id = itemdb_exists(nameid) ) == NULL )
    +    {
    +        ShowWarning("itemdb_read_vending: Invalid item id %d.\n", nameid);
    +        return false;
    +    }
    +
    +    if( id->type == IT_ARMOR || id->type == IT_WEAPON )
    +    {
    +        ShowWarning("itemdb_read_vending: item id %d cannot be equipment or weapon.\n", nameid);
    +        return false;
    +    }
    +
    +    item_vend[current].itemid = nameid;
    +
    +    return true;
    +}
    +
     /*======================================
      * Applies gender restrictions according to settings. [Skotlex]
      *======================================*/
    @@ -1007,6 +1028,7 @@
         sv_readdb(db_path, "item_trade.txt",   ',', 3, 3, -1,             &itemdb_read_itemtrade);
         sv_readdb(db_path, "item_delay.txt",   ',', 2, 2, MAX_ITEMDELAYS, &itemdb_read_itemdelay);
         sv_readdb(db_path, "item_buyingstore.txt", ',', 1, 1, -1,         &itemdb_read_buyingstore);
    +    sv_readdb(db_path, "item_vending.txt", ',', 1, 1, ARRAYLENGTH(item_vend), &itemdb_read_vending); // Extended Vending system [Lilith]
     }
     
     /*==========================================
    @@ -1059,7 +1081,8 @@
         itemdb_other->clear(itemdb_other, itemdb_final_sub);
     
         memset(itemdb_array, 0, sizeof(itemdb_array));
    -
    +    memset(item_vend,0,sizeof(item_vend)); // Extended Vending system [Lilith]
    +    
         // read new data
         itemdb_read();
     
    Index: src/map/itemdb.h
    ===================================================================
    --- src/map/itemdb.h    (revision 15091)
    +++ src/map/itemdb.h    (working copy)
    @@ -6,6 +6,9 @@
     
     #include "../common/mmo.h" // ITEM_NAME_LENGTH
     
    +// 32k array entries (the rest goes to the db)
    +#define MAX_ITEMDB 0x8000
    +
     #define MAX_RANDITEM    11000
     
     // The maximum number of item delays
    @@ -91,7 +94,10 @@
         int nameid[MAX_RANDITEM];
         int qty; //Counts amount of items in the group.
     };
    -
    +struct s_item_vend{
    +    int itemid;
    +};
    +struct s_item_vend item_vend[MAX_INVENTORY];
     struct item_data* itemdb_searchname(const char *name);
     int itemdb_searchname_array(struct item_data** data, int size, const char *str);
     struct item_data* itemdb_load(int nameid);
    @@ -149,4 +155,10 @@
     void do_final_itemdb(void);
     int do_init_itemdb(void);
     
    +/**
    + * Extended Vending system [Lilith]
    + **/
    +#define ITEMID_ZENY battle_config.item_zeny
    +#define ITEMID_CASH battle_config.item_cash
    +
     #endif /* _ITEMDB_H_ */
    Index: src/map/pc.h
    ===================================================================
    --- src/map/pc.h    (revision 15091)
    +++ src/map/pc.h    (working copy)
    @@ -423,6 +423,12 @@
         // temporary debugging of bug #3504
         const char* delunit_prevfile;
         int delunit_prevline;
    +
    +    /**
    +     * Extended Vending system [Lilith]
    +     **/
    +    int vend_loot;
    +    int vend_lvl;
     };
     
     //Update this max as necessary. 55 is the value needed for Super Baby currently
    Index: src/map/skill.c
    ===================================================================
    --- src/map/skill.c    (revision 15091)
    +++ src/map/skill.c    (working copy)
    @@ -4332,10 +4332,37 @@
             {    //Prevent vending of GMs with unnecessary Level to trade/drop. [Skotlex]
                 if ( !pc_can_give_items(pc_isGM(sd)) )
                     clif_skill_fail(sd,skillid,USESKILL_FAIL_LEVEL,0);
    -            else
    -                clif_openvendingreq(sd,2+skilllv);
    -        }
    -        break;
    +            else { // Extended Vending system [Lilith]
    +                if(battle_config.extended_vending){
    +                    struct item_data *item;
    +                    char output[1024];
    +                    int c, i;
    +                    
    +                    sd->vend_lvl = skilllv;
    +                    
    +                    for( c = 0, i = 0; i < ARRAYLENGTH(item_vend); i ++ ) {
    +                        if((item = itemdb_exists(item_vend.itemid)) != NULL)
    +                            c++;
    +                    }
    +                    
    +                    if(c > 1)
    +                        clif_vend(sd,sd->vend_lvl);
    +                    else { 
    +                        if(c == 1) {
    +                            item = itemdb_exists(item_vend[0].itemid);
    +                            sd->vend_loot = item->nameid;
    +                        } else 
    +                            sd->vend_loot = ITEMID_ZENY;
    +                        
    +                        sprintf(output,"Current Currency: %s" ,itemdb_jname(sd->vend_loot));
    +                        clif_displaymessage(sd->fd,output);
    +                        clif_openvendingreq(sd,2+sd->vend_lvl);
    +                    }
    +                } else
    +                        clif_openvendingreq(sd,2+skilllv);
    +             }
    +         }
    +         break;
     
         case AL_TELEPORT:
             if(sd)
    @@ -6697,6 +6724,38 @@
         return map_foreachincell(skill_dance_overlap_sub, unit->bl.m,unit->bl.x,unit->bl.y,BL_SKILL, unit,flag);
     }
     
    +/**
    + * Extended Vending system [Lilith]
    + **/
    +int skill_vending( struct map_session_data *sd, int nameid) {
    +
    +    struct item_data *item;
    +    char output[1024];
    +    
    +    nullpo_ret(sd);
    +
    +    if( nameid <= 0) {
    +        clif_skill_fail(sd,MC_VENDING,USESKILL_FAIL_LEVEL,0);
    +        return 0;
    +    }
    +    
    +    if( nameid > MAX_ITEMDB )
    +        return 0;
    +    
    +    sd->vend_loot = nameid;
    +    item = itemdb_exists(nameid);
    +    
    +    sprintf(output,"You have selected: %s",itemdb_jname(sd->vend_loot));
    +    clif_displaymessage(sd->fd,output);
    +
    +    if ( !pc_can_give_items(pc_isGM(sd)))
    +        clif_skill_fail(sd,MC_VENDING,USESKILL_FAIL_LEVEL,0);
    +    else 
    +        clif_openvendingreq(sd,2+sd->vend_lvl);
    +    
    +    return 0;
    +}
    +
     /*==========================================
      * Converts this group information so that it is handled as a Dissonance or Ugly Dance cell.
      * Flag: 0 - Convert, 1 - Revert.
    Index: src/map/skill.h
    ===================================================================
    --- src/map/skill.h    (revision 15091)
    +++ src/map/skill.h    (working copy)
    @@ -1548,4 +1548,9 @@
         UNT_MAX = 0x190
     };
     
    +/**
    + * Extended Vending system [Lilith]
    + **/
    +int skill_vending( struct map_session_data *sd, int nameid);
    +
     #endif /* _SKILL_H_ */
    Index: src/map/vending.c
    ===================================================================
    --- src/map/vending.c    (revision 15091)
    +++ src/map/vending.c    (working copy)
    @@ -47,6 +47,7 @@
     void vending_vendinglistreq(struct map_session_data* sd, int id)
     {
         struct map_session_data* vsd;
    +    char output[1024]; // Extended Vending system [Lilith]
         nullpo_retv(sd);
     
         if( (vsd = map_id2sd(id)) == NULL )
    @@ -59,6 +60,12 @@
             clif_displaymessage(sd->fd, msg_txt(246));
             return;
         } 
    +    
    +    /**
    +     * Extended Vending system [Lilith]
    +     **/
    +    sprintf(output,msg_txt(705),itemdb_jname(vsd->vend_loot));
    +    clif_displaymessage(sd->fd,output);
     
         sd->vended_id = vsd->vender_id;  // register vending uid
     
    @@ -121,16 +128,62 @@
                 vend_list = j;
     
             z += ((double)vsd->vending[j].value * (double)amount);
    -        if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY )
    -        {
    -            clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
    -            return;
    -        }
    -        if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max )
    -        {
    -            clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
    -            return;
    +        /**
    +         * Extended Vending system [Lilith]
    +         **/
    +        if(battle_config.extended_vending){
    +            if(vsd->vend_loot == ITEMID_ZENY) {
    +                if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY )
    +                {
    +                    //clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
    +                    return;
    +                }
    +                if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max )
    +                {
    +                    clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
    +                    return;
    +        
    +                }
    +            } else if(vsd->vend_loot == ITEMID_CASH){
    +                if(z > sd->cashPoints || z < 0. || z > (double)MAX_ZENY ) {
    +                    clif_displaymessage(sd->fd, msg_txt(700));
    +                    return;
    +                }
    +            } else {
    +                int k, loot_count = 0, vsd_w = 0;
    +                for(k = 0; k < MAX_INVENTORY; k++)
    +                    if(sd->status.inventory[k].nameid == vsd->vend_loot)
    +                        loot_count += sd->status.inventory[k].amount;
    +                        
    +                if( z > loot_count || z < 0)
    +                {
    +                    clif_displaymessage(sd->fd,msg_txt(701));
    +                    return;
    +                }
    +                if(pc_inventoryblank(vsd) <= 0)
    +                {
    +                    clif_displaymessage(sd->fd,msg_txt(702));
    +                    return;
    +                }
    +                vsd_w += itemdb_weight(vsd->vend_loot) * (int)z;
    +                if(vsd_w + vsd->weight > vsd->max_weight)
    +                {
    +                    clif_displaymessage(sd->fd,msg_txt(703));
    +                    return;
    +                }
     
    +            }
    +        } else {
    +            if( z > (double)sd->status.zeny || z < 0. || z > (double)MAX_ZENY )
    +            {
    +                clif_buyvending(sd, idx, amount, 1); // you don't have enough zeny
    +                return;
    +            }
    +            if( z + (double)vsd->status.zeny > (double)MAX_ZENY && !battle_config.vending_over_max )
    +            {
    +                clif_buyvending(sd, idx, vsd->vending[j].amount, 4); // too much zeny = overflow
    +                return;
    +            }
             }
             w += itemdb_weight(vsd->status.cart[idx].nameid) * amount;
             if( w + sd->weight > sd->max_weight )
    @@ -166,15 +219,44 @@
                 return; //too many items
             }
         }
    +    
    +    /**
    +     * Extended Vending system [Lilith]
    +     **/
    +    if(battle_config.extended_vending){
    +        if(vsd->vend_loot == ITEMID_ZENY) {
    +        
    +            //Logs (V)ending Zeny [Lupus]
    +            log_zeny(vsd, LOG_TYPE_VENDING, sd, (int)z);
    +        
    +            pc_payzeny(sd, (int)z);
    +            if( battle_config.vending_tax )
    +                z -= z * (battle_config.vending_tax/10000.);
    +            pc_getzeny(vsd, (int)z);
    +            
    +        } else if(vsd->vend_loot == ITEMID_CASH) {
    +            pc_paycash(sd,(int)z,0);
    +            pc_getcash(vsd,(int)z,0);
    +        } else {
    +            for( i = 0; i < MAX_INVENTORY; i++)
    +                if(sd->status.inventory.nameid == vsd->vend_loot)
    +                {
    +                    struct item *item;
    +                    item = &sd->status.inventory;
    +                    pc_additem(vsd,item,(int)z);
    +                }
    +            pc_delitem(sd,pc_search_inventory(sd, vsd->vend_loot),(int)z,0,6);
    +            
    +        }
    +    } else {
    +        //Logs (V)ending Zeny [Lupus]
    +        log_zeny(vsd, LOG_TYPE_VENDING, sd, (int)z);
    +            pc_payzeny(sd, (int)z);
    +        if( battle_config.vending_tax )
    +            z -= z * (battle_config.vending_tax/10000.);
    +        pc_getzeny(vsd, (int)z);
    +    }
     
    -    //Logs (V)ending Zeny [Lupus]
    -    log_zeny(vsd, LOG_TYPE_VENDING, sd, (int)z);
    -
    -    pc_payzeny(sd, (int)z);
    -    if( battle_config.vending_tax )
    -        z -= z * (battle_config.vending_tax/10000.);
    -    pc_getzeny(vsd, (int)z);
    -
         for( i = 0; i < count; i++ )
         {
             short amount = *(uint16*)(data + 4*i + 0);

     

     

    • Upvote 1
  9. 1 час назад, E r a сказал:

    да, я так и сделаю. да у меня клиент 2016.  можно и побольше конкретики, в статус конф стандартно стоит антистатус 200 вит который не работает, тоесть при макс левеле и при статах там любых, пусть будет по 300 или по 1000 все равно антистатус не работает. антистатус это антифриз, анти стон, анти курс, анти что то там еще. все что можно найти в интернете ето изменить status.c. тут прописаны формулы статусов, но прикол в том что как не меняй эти формулы абсолютно ничего не меняется. тут на форуме есть тема что в реневале новая механика. и потому вот такая штука. но я так и не нашла и не поняла что это означает  и возможно ли вообще их теперь менять

    Отключите RENEWAL в src/config/renewal.h и PACKET_OBFUSCATION в src/config/core.h

    //#define RENEWAL
    //#define PACKET_OBFUSCATION

    Находим conf/battle/status.conf

    // Adjustment for the natural rate of resistance from status changes.
    // If 50, status defense is halved, and you need twice as much stats to block
    // them (eg: 200 vit to completely block stun)
    pc_status_def_rate: 50
    mob_status_def_rate: 100
    11 минуту назад, Kreol89 сказал:

    Вот я бы очень поспорил. У меня RagexeRE  и есть Cash Shop.

    Может я ошибаюсь, но возможно в версиях клиента старше 2012-04-10 просто добавили функционал кеш шопа для RagexeRE

  10. 1 час назад, E r a сказал:

    но если использовать рахену возникает еще одна проблема.... антистатусы, антикасты не настраиваются( смена кода тоже не помогает

    В каком смысле не настраиваются? Можно конкретики побольше?

    Скорее всего ваша проблема как и была у меня, не используйте новый клиент на древнем эмуляторе eAthena и выкиньте его в помойку.

  11. Советую использовать rAthena. Неделю назад сидел на eAthena и возникла необходимость обновить игровой клиент. Но там к сожалению, кеш шоп работает некорректно, видимо не до конца реализована поддержка новых EXE + вы столкнётесь с багом телеги и не сможете использовать NEW_CART в старой афине на новом клиенте. Даже не пытайтесь перенести сами, я убил 3 часа времени и всё безрезультатно.

    RagexeRE - нет cash shop

    Ragexe - cash shop есть

    Используйте стабильный EXE - 2012-04-10aragexe

    Решение проблем с работой Cash Shop:

    • Чтобы не выкидывало из игры с неизвестным пакетом при заходе или варпе, нужно обязательно добавить хотя бы 1 предмет в item_cash_db.txt
    • Чтобы работала функция покупки в кеш шопе

    Находим db/packet_db.txt

    После:

    // Merge Item
    0x096D,-1,ZC_MERGE_ITEM_OPEN,2:4 // ZC_MERGE_ITEM_OPEN
    0x096E,-1,mergeitem_req,2:4 // CZ_REQ_MERGE_ITEM
    0x096F,7,ZC_ACK_MERGE_ITEM,2:4:6 // ZC_ACK_MERGE_ITEM
    0x0974,2,mergeitem_cancel,0 // CZ_CANCEL_MERGE_ITEM

    Добавляем:

    // New cashshop
    0x0844,2,cashshopopen,0
    0x084a,2,cashshopclose,0
    0x08c9,4,cashshopitemlist,0
    0x0848,-1,cashshopbuy,2:6:4:10

    В игре используем команду @reloadpacketdb либо перезапускаем сервер.

  12. Уже были попытки открываться, чем в этот раз лучше будет?

    P.S: Не сочтите за грубость, но нехорошо идти по участникам нашей группы и рекламировать свой сервер в личку, на вас жалуются многие игроки. Я конечно всё понимаю, но есть и другие более грамотные способы пиара.

    • Upvote 1
  13. 1 час назад, E r a сказал:

    тут не только ветки тут полностью профа новиса, а должен быть только спрайт

    Если мне память не изменяет, то если скиллы выставлены изначально на панель умений и если сменить спрайт через changebase, то можно пользоваться скиллами своей профессии.

  14. Если интересует хай рейт 254/120, то могу предложить свой http://skyro.it-ground.net/

    После последних обновлений, вначале игры даётся адванс профа + годлайки арендой + книга на опыт x3

    Любые виды фарма на выбор (бг, фарм зоны, рыбалка, шахты и т.д.). Очень много разнообразия и других приятных бонусов. 

    При большом желании/времени фул шмот делается за пару дней. Если возникли вопросы или нужна помощь - пишите в ЛС

  15.  

    Скрытый текст
    
    ACMD_FUNC(loginfo)
    {
           char name[NAME_LENGTH],date[10], cname[NAME_LENGTH], ref[5] = "+";
           int char_id, nameid, year, month, day, i=0,k=1;
           struct {
                   char map[50][50],type[50][1],time[50][20];
                   int amount[50],refine[50];
           } log;
           char* data;
           size_t len;
           struct item_data* item;
           
           memset(&log, 0, sizeof(log));
    
           if(sscanf(message, "%23[^,], %d, %23[^,]", name, &nameid, date) == 3)
           {
                   if(sscanf(date,"%d-%d-%d",&year,&month,&day) !=3)
                   {
                           clif_displaymessage(fd,"Введи правильно дату");
                           clif_displaymessage(fd,"гггг-мм-дд");
                           return 0;
                   }
           
                   if( SQL_ERROR == Sql_Query(mmysql_handle,"SELECT `char_id`,`name` FROM `char` WHERE `name` = '%s'",name))
                   {
                           Sql_ShowDebug(mmysql_handle);
                           Sql_FreeResult(mmysql_handle);
                           return 0;
                   }
                   
                   if( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
                           Sql_GetData(mmysql_handle, 0, &data, &len); char_id = atoi(data);
                           Sql_GetData(mmysql_handle, 1, &data, &len); strcpy(cname,data);
                   Sql_FreeResult(mmysql_handle);
                   
                   if(strcmp(cname,name) != 0)
                   {
                           clif_displaymessage(fd,"Чар с таким ником не найден.");
                           return 0;
                   }
           
                   if(!(item = itemdb_exists(nameid)))
                   {
                           clif_displaymessage(fd,"ID вещи введено не верно.");
                           return 0;
                   }
    
                   if( SQL_ERROR == Sql_Query(mmysql_handle,"SELECT time,type,amount,refine,map FROM picklog WHERE char_id = '%d' AND nameid = '%d'",char_id,nameid))
                   {
                           Sql_ShowDebug(mmysql_handle);
                           Sql_FreeResult(mmysql_handle);
                           return 0;
                   }
                   while( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
                   {
                           Sql_GetData(mmysql_handle, 0, &data, &len); 
    
                           if(!strstr(data,date))
                                   continue;
    
                           strncpy(&log.time[i][20],data,strlen(data));
                           
                           Sql_GetData(mmysql_handle, 1, &data, &len); log.type[i+1][0] = data[0];
                           Sql_GetData(mmysql_handle, 2, &data, &len); log.amount[i+1] = atoi(data);
                           Sql_GetData(mmysql_handle, 3, &data, &len); log.refine[i+1] = atoi(data);
                           Sql_GetData(mmysql_handle, 4, &data, &len); strcpy(&log.map[i][50],data);
                           i++;
                   }
                   Sql_FreeResult(mmysql_handle);
                   
                   if(i == 0)
                   {
                           clif_displaymessage(fd,"По данному запросу ничего не найдено.");
                           return 0;
                   }
    
                   while(k <= i)
                   {
                           int m=0;
                           char operation[50], output[1024], char_name[NAME_LENGTH];
    
                           if(log.type[k][0] == 'T' || log.type[k][0] == 'V')
                           {
                                   if( SQL_ERROR == Sql_Query(mmysql_handle,
                                   "SELECT `char`.`name` FROM `char`,`picklog` WHERE `time` = '%s' AND `picklog`.`char_id` != '%d' AND `type` = '%c' AND `nameid` = '%d' AND `map` = '%s' AND `picklog`.`char_id` = `char`.`char_id`",log.time[k],char_id,log.type[k][0],nameid,log.map[k]))
                                   {
                                           Sql_ShowDebug(mmysql_handle);
                                           Sql_FreeResult(mmysql_handle);
                                           return 0;
                                   }
    
                                   if( SQL_SUCCESS == Sql_NextRow(mmysql_handle) )
                                   {
                                           Sql_GetData(mmysql_handle, 0, &data, &len); strcpy(char_name,data);
                                   }
                                   Sql_FreeResult(mmysql_handle);
                           }
                           memset(operation, '\0', sizeof(operation));
                           memset(output, '\0', sizeof(output));
                           memset(ref, '\0', sizeof(ref));
                           
                           if(log.refine[k] > 0)
                                   sprintf(ref,"+%d",log.refine[k]);
                           switch(log.type[k][0])
                           {
                                   case 'T':
                                           if(log.amount[k] > 0)
                                                   sprintf(operation,"получил от %s",char_name);
                                           else
                                                   sprintf(operation,"передал %s'у",char_name);
                                   break;
                                   
                                   case 'V':
                                           if(log.amount[k] > 0)
                                                   sprintf(operation,"купил у %s",char_name);
                                           else
                                                   sprintf(operation,"продал %s'у",char_name);
                                   break;
                                   
                                   case 'P':
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"подобрал");
                                           else
                                                   strcpy(operation,"выкинул");
                                   break;
                                   
                                   case 'S':
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"купил");
                                           else
                                                   strcpy(operation,"продал");
                                   break;
    
                                   case 'N':
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"получил у НПЦ");
                                           else
                                                   strcpy(operation,"отдал НПЦ");
                                   break;
                                   
                                   case 'D':                                       // Может не использоваться на некоторых эмулях
                                                   strcpy(operation,"украл");
                                   break;
                                   
                                   case 'C':
                                                   strcpy(operation,"использовал");
                                   break;
                                   
                                   case 'O':                                       // Может не использоваться на некоторых эмулях
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"изготовил");
                                           else
                                                   strcpy(operation,"для изготовления отдал");
                                   break;
                                   
                                   case 'U':                                       // Может не использоваться на некоторых эмулях
                                                   strcpy(operation,"получил с MvP");
                                   break;
                                   
                                   case 'A':
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"получил командой");
                                           else
                                                   strcpy(operation,"удалил командой");
                                   break;
                                   
                                   case 'R':
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"достал из кафры");
                                           else
                                                   strcpy(operation,"положил в кафру");
                                   break;
                                   
                                   case 'G':
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"достал из гильд кафры");
                                           else
                                                   strcpy(operation,"положил в гильд кафру");
                                   break;
                                   
                                   case 'E':
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"получил по почте");
                                           else
                                                   strcpy(operation,"передал по почте");
                                   break;
                                   
                                   case 'I':                                       // Может не использоваться на некоторых эмулях
                                           if(log.amount[k] > 0)
                                                   strcpy(operation,"получил с аукциона");
                                           else
                                                   strcpy(operation,"отдал на аукцион");
                                   break;
                           }
                           sprintf(output,"[%s] %s %s %s%s[%dшт.] на карте: %s",log.time[k],cname,operation,ref,item->jname,abs(log.amount[k]),log.map[k]);
                           clif_displaymessage(fd,output);
                           k++;
                   }
           }
           return 0;
    }

     

     

    • Upvote 1
×
×
  • Создать...
Яндекс.Метрика