One char per gm account

Svanhild

New member
Messages
115
Points
0
Location
Queenslander
Emulator
I use to have this feature in rathena, but I lost and forgot the source mod for this. So I'm requesting another one.

 
simple patch plugin

#include "common/hercules.h"#include <stdio.h>#include <string.h>#include <stdlib.h>#include "char/char.h"#include "common/nullpo.h"#include "common/HPMDataCheck.h"HPExport struct hplugin_info pinfo = { "1charpergm", // Plugin name SERVER_TYPE_CHAR,// Which server types this plugin works with? "0.1", // Plugin version HPM_VERSION, // HPM Version (don't change, macro is automatically updated)};int char_make_new_char_sql_pre(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) { nullpo_retr(-2, sd); if ( slot != 0 && sd->group_id > 10 ) { // change 10 to minimum gm level hookStop(); return -2; } return 0;}HPExport void plugin_init (void) { addHookPre( "chr->make_new_char_sql", char_make_new_char_sql_pre );}EDIT : change 'char->' into 'chr->'now it works

EDIT2: what have I done LOL

forgot to add slot variable

 
Last edited by a moderator:
Check what I did here on char.c

Code:
if( sd->group_id > 0 && sd->group_id < 99 ) {		if( SQL_ERROR == SQL->Query(inter->sql_handle, "SELECT 1 FROM `%s` WHERE `account_id` = '%d'", char_db, sd->account_id) )			Sql_ShowDebug(inter->sql_handle);		if( SQL->NumRows(inter->sql_handle) >= 1 )			return -2; // character account limit exceeded	}// check char slot    if( sd->found_char[slot] != -1 )        return -2; /* character account limit exceeded */
 
nonono ... the char_make_new_char_sql function already has a slot variable

so we can make use of that variable for not using sql syntax

btw, my mistake for not using slot variable in my previous post, fixed

src/char/char.c | 8 ++++++++ 1 file changed, 8 insertions(+)diff --git a/src/char/char.c b/src/char/char.cindex 41b13b3..d5849f5 100644--- a/src/char/char.c+++ b/src/char/char.c@@ -1671,6 +1671,9 @@ int char_make_new_char_sql(struct char_session_data* sd, char* name_, int str, i return -2; // invalid input #endif + if ( slot != 0 && sd->group_id > 10 ) { // change 10 to minimum gm level+ return -2;+ } // check char slot if( sd->found_char[slot] != -1 ) return -2; /* character account limit exceeded */@@ -4574,6 +4577,11 @@ void char_parse_char_select(int fd, struct char_session_data* sd, uint32 ipl) } #endif + if ( slot != 0 && sd->group_id > 10 ) {+ chr->creation_failed(fd, -2);+ return;+ }+ ARR_FIND(0, ARRAYLENGTH(chr->server), server_id, chr->server[server_id].fd > 0 && VECTOR_LENGTH(chr->server[server_id].maps) > 0); /* not available, tell it to wait (client wont close; char select will respawn). * magic response found by Ind thanks to Yommy <3 */somehow I'm unable to write the char_parse_char_select as plugin ...I always get error for this line in plugin

Code:
int slot = RFIFOB(fd,2);
 
Last edited by a moderator:
yeah, I noticed that and re-written the code earlier and it went fine, but I'll be using your code instead, I trust you for creating reliable codes. Thanks, Annie.

EDIT: Tested and it worked.

 
Last edited by a moderator:
Can some one please fix this Code or Provide another source mod which limit char creation for GM account... please

 
latest revision, patch

src/char/char.c | 8 ++++++++
1 file changed, 8 insertions(+)

diff --git a/src/char/char.c b/src/char/char.c
index 330b0639f..d61203407 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -1729,6 +1729,9 @@ static int char_make_new_char_sql(struct char_session_data *sd, const char *name
return -2; // Char Creation Denied
}

+ if ( slot != 0 && sd->group_id > 10 )
+ return -2;
+
//check other inputs
#if PACKETVER >= 20120307
if(slot < 0 || slot >= sd->char_slots)
@@ -4565,6 +4568,11 @@ static void char_parse_char_select(int fd, struct char_session_data *sd, uint32

RFIFOSKIP(fd,3);

+ if ( slot != 0 && sd->group_id > 10 ) {
+ chr->creation_failed(fd, -4);
+ return;
+ }
+
#if PACKETVER >= 20110309
if( pincode->enabled ){ // hack check
struct online_char_data* character;

plugin

#include "common/hercules.h"
#include "char/char.h"
#include "common/nullpo.h"
#include "common/socket.h"
#include "plugins/HPMHooking.h"
#include "common/HPMDataCheck.h"

HPExport struct hplugin_info pinfo = {
"1charpergm",
SERVER_TYPE_CHAR,
"0.2a",
HPM_VERSION,
};

static int char_make_new_char_sql_pre( struct char_session_data **sd, const char **name_, int *str, int *agi, int *vit, int *int_, int *dex, int *luk, int *slot, int *hair_color, int *hair_style, int *starting_job, uint8 *sex) {
nullpo_retr(-2, *sd);
if ( *slot != 0 && (*sd)->group_id > 10 ) { // change 10 to minimum gm level
hookStop();
return -2;
}
return 0;
}

static void char_parse_char_select_pre( int *fd, struct char_session_data **sd, uint32 *ipl ) {
int slot = RFIFOB(*fd, 2);
if ( slot != 0 && (*sd)->group_id > 10 ) {
RFIFOSKIP(*fd, 3);
chr->creation_failed(*fd, -4);
hookStop();
}
return;
}

HPExport void plugin_init (void) {
addHookPre( chr, make_new_char_sql, char_make_new_char_sql_pre );
addHookPre( chr, parse_char_select, char_parse_char_select_pre );
}

the reason for the patch is because this was requested from rAthena forum
https://rathena.org/board/topic/118143-bonus-expansion-pack/?do=findComment&comment=357155

 
Last edited by a moderator:
Back
Top