Jump to content

malufett

Members
  • Posts

    554
  • Joined

  • Last visited

  • Days Won

    1

Posts posted by malufett

  1. once you receive the patch list it means your patcher is ok..however it seems that the patch server is out of reach even though you have a fast connection..or try to use proxy..

    can you test to ping it or access ro.game.gnjoy.com

    :meow:

  2. indeed testing stuff with carts is now a pain since they no longer work with @option (since the new carts ain't a option)

    hahaha..I know what it feels like....

    :meow:

  3. //-----------------------------------
    // Function to create a new character
    //-----------------------------------
    #if PACKETVER >= 20120307
    int make_new_char_sql(struct char_session_data* sd, char* name_, int slot, int hair_color, int hair_style) {
    int str = 1, agi = 1, vit = 1, int_ = 1, dex = 1, luk = 1;
    #else
    int make_new_char_sql(struct char_session_data* sd, char* name_, int str, int agi, int vit, int int_, int dex, int luk, int slot, int hair_color, int hair_style) {
    #endif
    
    char name[NAME_LENGTH];
    char esc_name[NAME_LENGTH*2+1];
    int char_id, flag;
    
    safestrncpy(name, name_, NAME_LENGTH);
    normalize_name(name,TRIM_CHARS);
    Sql_EscapeStringLen(sql_handle, esc_name, name, strnlen(name, NAME_LENGTH));
    
    flag = check_char_name(name,esc_name);
    if( flag < 0 )
    	return flag;
    
    //check other inputs
    #if PACKETVER >= 20120307
    if(slot >= MAX_CHARS)
    #else
    if((slot >= MAX_CHARS) // slots
    || (str + agi + vit + int_ + dex + luk != 6*5 ) // stats
    || (str < 1 || str > 9 || agi < 1 || agi > 9 || vit < 1 || vit > 9 || int_ < 1 || int_ > 9 || dex < 1 || dex > 9 || luk < 1 || luk > 9) // individual stat values
    || (str + int_ != 10 || agi + luk != 10 || vit + dex != 10) ) // pairs
    #endif
    	return -2; // invalid input
    
    // check the number of already existing chars in this account
    if( char_per_account != 0 ) {
    	if( SQL_ERROR == Sql_Query(sql_handle, "SELECT 1 FROM `%s` WHERE `account_id` = '%d'", char_db, sd->account_id) )
    		Sql_ShowDebug(sql_handle);
    	if( Sql_NumRows(sql_handle) >= char_per_account )
    		return -2; // character account limit exceeded
    }
    
    // check char slot
    if( SQL_ERROR == Sql_Query(sql_handle, "SELECT 1 FROM `%s` WHERE `account_id` = '%d' AND `char_num` = '%d' LIMIT 1", char_db, sd->account_id, slot) )
    	Sql_ShowDebug(sql_handle);
    if( Sql_NumRows(sql_handle) > 0 )
    	return -2; // slot already in use
    
    // validation success, log result
    if (log_char) {
    	if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`time`, `char_msg`,`account_id`,`char_num`,`name`,`str`,`agi`,`vit`,`int`,`dex`,`luk`,`hair`,`hair_color`)"
    		"VALUES (NOW(), '%s', '%d', '%d', '%s', '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d')",
    		charlog_db, "make new char", sd->account_id, slot, esc_name, str, agi, vit, int_, dex, luk, hair_style, hair_color) )
    		Sql_ShowDebug(sql_handle);
    }
    #if PACKETVER >= 20120307
    //Insert the new char entry to the database
    if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `status_point`,`str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
    	"`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
    	"'%d', '%d', '%s', '%d',  '%d','%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
    	char_db, sd->account_id , slot, esc_name, start_zeny, 48, str, agi, vit, int_, dex, luk,
    	(40 * (100 + vit)/100) , (40 * (100 + vit)/100 ),  (11 * (100 + int_)/100), (11 * (100 + int_)/100), hair_style, hair_color,
    	mapindex_id2name(start_point.map), start_point.x, start_point.y, mapindex_id2name(start_point.map), start_point.x, start_point.y) )
    {
    	Sql_ShowDebug(sql_handle);
    	return -2; //No, stop the procedure!
    }
    #else
    //Insert the new char entry to the database
    if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`account_id`, `char_num`, `name`, `zeny`, `str`, `agi`, `vit`, `int`, `dex`, `luk`, `max_hp`, `hp`,"
    						   "`max_sp`, `sp`, `hair`, `hair_color`, `last_map`, `last_x`, `last_y`, `save_map`, `save_x`, `save_y`) VALUES ("
    						   "'%d', '%d', '%s', '%d',  '%d', '%d', '%d', '%d', '%d', '%d', '%d', '%d','%d', '%d','%d', '%d', '%s', '%d', '%d', '%s', '%d', '%d')",
    						   char_db, sd->account_id , slot, esc_name, start_zeny, str, agi, vit, int_, dex, luk,
    						   (40 * (100 + vit)/100) , (40 * (100 + vit)/100 ),  (11 * (100 + int_)/100), (11 * (100 + int_)/100), hair_style, hair_color,
    						   mapindex_id2name(start_point.map), start_point.x, start_point.y, mapindex_id2name(start_point.map), start_point.x, start_point.y) )
    {
    	Sql_ShowDebug(sql_handle);
    	return -2; //No, stop the procedure!
    }	
    #endif
    //Retrieve the newly auto-generated char id
    char_id = (int)Sql_LastInsertId(sql_handle);
    //Give the char the default items
    if (start_weapon > 0) { //add Start Weapon (Knife?)
    	if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `identify`) VALUES ('%d', '%d', '%d', '%d')", inventory_db, char_id, start_weapon, 1, 1) )
    		Sql_ShowDebug(sql_handle);
    }
    if (start_armor > 0) { //Add default armor (cotton shirt?)
    	if( SQL_ERROR == Sql_Query(sql_handle, "INSERT INTO `%s` (`char_id`,`nameid`, `amount`, `identify`) VALUES ('%d', '%d', '%d', '%d')", inventory_db, char_id, start_armor, 1, 1) )
    		Sql_ShowDebug(sql_handle);
    }
    
    ShowInfo("Created char: account: %d, char: %d, slot: %d, name: %s\n", sd->account_id, char_id, slot, name);
    return char_id;
    }

    :meow:

    • Upvote 1
  4. Well.. the multiple countitem would be sorta good. It will lessen lines of scripts from creating multiple countitem lines in a script D: or one massive long line of multiple if(countitem asfasf < fasf) || (countitem fnaskfm < fkasfk)) etc. xD

    but the suggested script command is still not suitable with this kind of situation...

    for example:

    I need to count 5 apples and 10 oranges..

    so I will use countitem( apples, oranges ) but what if I have 14 oranges and 1 apple?? see kinda useless...

    but in reality countitem(apples) >= 5 && countitem(oranges) >= 15

    however if we will do counteitem(apples,5,oranges,15) but same it not worth it in purpose..

    maybe you could suggest like checkitem(apples, oranges) that it will return the overall number of items regardless the individual quantity..just like saying I need apples and oranges that when add it will give me a result of 15..

    :meow:

  5. Serves no purpose, I vote no.

    +1

    unless official servers created npc/quest where it requires counting items regardless of type to suffice required amount of items.....

    :meow:

  6. Hello,

    this is just my speculations/observation in aegis and official server...

    Characteristics:

    1. not equitable

    2. an etc type indeed its type #17

    Usage/Function of type#17:

    1. used to differentiate other etc type items

    2. for easy indexing when searching this item as ammunition in some other skills..

    so what do you think/opinion?

    :meow:

    • Upvote 1
  7. try this

    @clif.c

    
    case BL_PC:
    	{
    		struct map_session_data *ssd = (struct map_session_data *)bl;
    		struct party_data *p = NULL;
    		struct guild *g = NULL;
               +char name[NAME_LENGTH];
    
    		//Requesting your own "shadow" name. [skotlex]
    		if (ssd->fd == fd && ssd->disguise)
    			WBUFL(buf,2) = -bl->id;
    
    		if( ssd->fakename[0] )
    		{
    			WBUFW(buf, 0) = cmd = 0x195;
    			memcpy(WBUFP(buf,6), ssd->fakename, NAME_LENGTH);
    			WBUFB(buf,30) = WBUFB(buf,54) = WBUFB(buf,78) = 0;
    			break;
    		}
               +sprintf(name, "[%d/%d] %s", ssd->status.base_level, pc_maxbaselv(ssd),ssd->status.name);
               +memcpy(WBUFP(buf,6), name, NAME_LENGTH);
               -memcpy(WBUFP(buf,6), ssd->status.name, NAME_LENGTH);
    

    NOTE:I didn't test it yet :meow:

  8. if you want a balanced mechanics then switch to renewal..but if your using it in a high rate then renewal mechanics will be useless then..IMO

    Are servers expected to meet the demands knowing most players have renewal now that sakray is rendered useless?

    well there will be cons and pros..but what is good in renewal is the new features and interfaces....

    :meow:

  9. guide for a such is like a retarded thing...

    no one is like a machine except if he is really dedicated and start working in creating in detailed guide for a big thing like athena core structure..

    I suggest

    learn C Programming...

    or even other languages as long as you learn the basics

    and start reading rAthena core structure..start from atcommand.c to unit.c

    :)

×
×
  • Create New...