示例#1
0
void disp_char(int index, char *ch)
{
  if (gcin_edit_display_ap_only())
    return;
  if (!top_bin)
    return;

//  dbg("disp_char %d %s\n", index, ch);
  create_char(index);
  GtkWidget *label = chars[index].label;

  if (label) {
    if (ch[0]==' ' && ch[1]==' ')
      set_label_space(label);
    else {
      gtk_label_set_text(GTK_LABEL(label), ch);
    }
  }

#if GTK_CHECK_VERSION(3,0,0)
    // bug in gtk3
    set_label_font_size(label, gcin_font_size);
#endif

  get_win0_geom();
  if (win_x + win_xl >= dpy_xl)
    move_win0(dpy_xl - win_xl, win_y);

  gtk_widget_show_all(chars[index].vbox);
}
示例#2
0
文件: parser.cpp 项目: Arelius/ploy
pointer parse_expr(parser* parse)
{
    eat_whitespace(parse);
    pointer ret_car;
    pointer ret_cdr;
    switch(*parse->curr)
    {
    case '(':
        parse->curr++;
        ret_car = parse_expr(parse);
        ret_cdr = parse_expr(parse);
        return create_pair(ret_car, ret_cdr);
    case '"':
        ret_car = parse_string(parse);
        ret_cdr = parse_expr(parse);
        return create_pair(ret_car, ret_cdr);
    case '\'':
        parse->curr++;
        ret_car = parse_quote(parse);
        ret_cdr = parse_expr(parse);
        return create_pair(ret_car, ret_cdr);
    case ')':
        parse->curr++;
        return NIL;
    case '+': case '-': case 'b':
        ret_car = parse_number_or_symbol(parse);
        ret_cdr = parse_expr(parse);
        return create_pair(ret_car, ret_cdr);
    case '.':
        return parse_number_or_pair(parse);
    case '\\':
        parse->curr++;
        ret_car = create_char(*(parse->curr++));
        ret_cdr = parse_expr(parse);
        return create_pair(ret_car, ret_cdr);
    case ';':
        while(!is_newline(*parse->curr) && *parse->curr != '\0')
            parse->curr++;
        return parse_expr(parse);
    case 0:
        return NIL;
    default:
        if(is_number_char(*parse->curr))
        {
            ret_car = parse_number(parse);
            ret_cdr = parse_expr(parse);
            return create_pair(ret_car, ret_cdr);
        }
        else if(is_symbol_char(*parse->curr))
        {
            ret_car = parse_symbol(parse);
            ret_cdr = parse_expr(parse);
            return create_pair(ret_car, ret_cdr);
        }
        else
            return parser_error(parse, "Unexpected char in expression.");

    }
    parse->curr++;
}
示例#3
0
void create_worker(int follow_cn, struct saltmine_ppd *ppd)
{
        int cn;
        struct saltmine_worker_data *workerdat;

        // create
        cn=create_char("monk_worker",0);
        if (!cn) { xlog("create_char() failed in %s %d",__FILE__,__LINE__); return; }

        snprintf(ch[cn].name,sizeof(ch[cn].name)-1,"%s's Monk",ch[follow_cn].name); ch[cn].name[sizeof(ch[cn].name)-1]=0;
        ch[cn].dir=DX_DOWN;
        update_char(cn);

        ch[cn].hp=ch[cn].value[0][V_HP]*POWERSCALE;
        ch[cn].endurance=ch[cn].value[0][V_ENDURANCE]*POWERSCALE;
        ch[cn].mana=ch[cn].value[0][V_MANA]*POWERSCALE;

        // set initital values
        if ((workerdat=set_data(cn,DRD_SALTMINE_WORKER,sizeof(struct saltmine_worker_data)))) {
                workerdat->follow_cn=follow_cn;
                workerdat->follow_serial=ch[follow_cn].serial;
        }
        else {
                destroy_char(cn);
                xlog("set_data() failed in %s %d",__FILE__,__LINE__);
                return;
        }

        // drop him to map
        if (!drop_char(cn,179,19,0) && !drop_char(cn,182,19,0)) { destroy_char(cn); xlog("drop_char() failed (%s,%d)",__FILE__,__LINE__); return; }

        // set first coords
        ch[cn].tmpx=ch[follow_cn].x;
        ch[cn].tmpy=ch[follow_cn].y;
}
示例#4
0
文件: win0.c 项目: duomaxwellr/hime
void disp_char(int index, char *ch)
{
    if (hime_edit_display_ap_only())
        return;
    if (!top_bin)
        return;

//  dbg("disp_char %d %s\n", index, ch);
    create_char(index);
    GtkWidget *label = chars[index].label;

    if (label) {
        if (ch[0]==' ' && ch[1]==' ')
            set_label_space(label);
        else {
            gtk_label_set_text(GTK_LABEL(label), ch);
        }
    }

    get_win0_geom();
    if (win_x + win_xl >= dpy_xl)
        move_win0(dpy_xl - win_xl, win_y);

    gtk_widget_show_all(chars[index].vbox);
}
示例#5
0
文件: font.c 项目: 7890/shout
//--------------------------------
//print every codepoint (single, plain, header)
void print_spf()
{
	int i=0;
	for(i=0;i<TOTAL_CHARS;i++)
	{
//		printf("//%d %d\n",spf_mapping_table[i][0],i);
		printf("//%d\n",spf_mapping_table[i][0]);
		create_char(spf_mapping_table[i][0]);
		print_char_cropped();
	}
}
示例#6
0
int open_window( GlobalFunc *global )
{
   int i;

   natorder = native_order();

   msgf    = global( LWMESSAGEFUNCS_GLOBAL, GFUSE_TRANSIENT );
   filereq = global( LWFILEREQFUNC_GLOBAL,  GFUSE_TRANSIENT );
   rasf    = global( LWRASTERFUNCS_GLOBAL,  GFUSE_TRANSIENT );
   panf    = global( LWPANELFUNCS_GLOBAL,   GFUSE_TRANSIENT );
   if ( !msgf || !filereq || !rasf || !panf )
      return AFUNC_BADGLOBAL;

   panf->globalFun = global;

   if( !( panel = PAN_CREATE( panf, PANEL_TITLE ))) {
      msgf->error( PLUGIN_NAME " couldn't create its panel,", "not sure why." );
      return AFUNC_OK;
   }

   panf->set( panel, PAN_USERKEYS, handle_key );
   panf->set( panel, PAN_USEROPEN, handle_panopen );

   cras[ 0 ] = create_char( COLOR_WHITE, SYSTEM_Ic( 30 ), rasf );
   cras[ 1 ] = create_char( COLOR_BLACK, SYSTEM_Ic(  2 ), rasf );
   cras[ 2 ] = create_char( COLOR_BLACK, SYSTEM_Ic( 15 ), rasf );

   create_controls();
   panf->open( panel, PANF_BLOCKING );

   PAN_KILL( panf, panel );

   for ( i = 0; i < 3; i++ )
      free_char( cras[ i ], rasf );
   free_icon( rasf );

   return AFUNC_OK;
}
示例#7
0
void keyholder_door(int in,int cn)
{
	int x,y,n,in2,flag,co,nr;
	char buf[80];

	if (!cn) return;

	nr=it[in].drdata[0];

	for (n=0; n<9; n++) {
		flag=0;
		for (x=2+(n%3)*8; x<9+(n%3)*8; x++) {
			for (y=231+(n/3)*8; y<238+(n/3)*8; y++) {
				if ((in2=map[x+y*MAXMAP].it) && (it[in2].flags&IF_TAKE)) { flag=1; break; }
				if (map[x+y*MAXMAP].ch) { flag=1; break; }
			}
		}
		if (!flag) break;
	}	
	if (flag) {
		log_char(cn,LOG_SYSTEM,0,"You hear fighting noises from behind the door. It won't open while the fight lasts.");
		return;
	}
        if (!(in2=ch[cn].citem) || it[in2].driver!=IDR_ENHANCE || it[in2].drdata[0]!=2 || *(unsigned int*)(it[in2].drdata+1)!=2000) {
		log_char(cn,LOG_SYSTEM,0,"You'll need to use 2000 gold units as a key to open the door.");
		return;
	}
	if (!teleport_char_driver(cn,2+(n%3)*8+1,231+(n/3)*8+3)) {
		log_char(cn,LOG_SYSTEM,0,"You hear fighting noises from behind the door. It won't open while the fight lasts.");
		return;
	}
	destroy_item(in2);
	ch[cn].citem=0;
	ch[cn].flags|=CF_ITEMS;

	sprintf(buf,"keyholder_golem%d",nr);
	co=create_char(buf,0);
	if (co) {
		update_char(co);
		ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE;
		ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE;
		ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE;
		ch[co].dir=DX_LEFTUP;
		ch[co].tmpx=2+(n%3)*8+5;
		ch[co].tmpy=231+(n/3)*8+3;

		drop_char(co,2+(n%3)*8+5,231+(n/3)*8+3,1);
	}
}
示例#8
0
void a_class_generator::
populate(const unsigned int position, result_type& v) {
    v.bool_property(create_bool(position + 0));
    v.char_property(create_char(position + 1));
    v.uchar_property(create_unsigned_char(position + 2));
    v.int_property(create_int(position + 3));
    v.uint_property(create_unsigned_int(position + 4));
    v.long_property(create_long(position + 5));
    v.ulong_property(create_unsigned_long(position + 6));
    v.long_long_property(create_long_long(position + 7));
    v.ulong_long_property(create_unsigned_long_long(position + 8));
    v.short_property(create_short(position + 9));
    v.ushort_property(create_unsigned_short(position + 10));
    v.double_property(create_double(position + 11));
    v.float_property(create_float(position + 12));
}
示例#9
0
void ritual_create_char(char *name, int x, int y, int dir, int attackstart)
{
        int cn;
        struct lab5_daemon_data *dat;

        // create
        cn=create_char(name,0);
        if (!cn) return;

        ch[cn].dir=dir;
        ch[cn].flags&=~CF_RESPAWN;
        update_char(cn);

        ch[cn].hp=ch[cn].value[0][V_HP]*POWERSCALE;
        ch[cn].endurance=ch[cn].value[0][V_ENDURANCE]*POWERSCALE;
        ch[cn].mana=ch[cn].value[0][V_MANA]*POWERSCALE;

        // drop him to map
        if (!drop_char(cn,x,y,0)) {
		destroy_char(cn);
                /*destroy_items(cn);
                free_char(cn);*/
                xlog("drop_char failed (%s,%d)",__FILE__,__LINE__);
                return;
        }

        // set values of the secure move driver
        ch[cn].tmpx=ch[cn].x;
        ch[cn].tmpy=ch[cn].y;

        // set direction of deamon driver
        dat=set_data(cn,DRD_LAB5_DAEMON,sizeof(struct lab5_daemon_data));
        if (dat) {
                dat->dir=dir;
                dat->attackstart=attackstart*TICKS;
        }

}
示例#10
0
void edemongate_driver(int in,int cn)
{
	int n,co,ser,nr;
	char name[80];
        if (cn) return;

	nr=it[in].drdata[0];

        if (nr==0) {
		static int pos[14]={
			62,157,
			62,164,
			62,174,
			62,184,
			62,191,
			56,174,
			67,174};
	
		for (n=0; n<7; n++) {
			co=*(unsigned short*)(it[in].drdata+4+n*4);
			ser=*(unsigned short*)(it[in].drdata+6+n*4);
	
			if (!co || !ch[co].flags || (unsigned short)ch[co].serial!=(unsigned short)ser) {
				sprintf(name,"edemon2s");
				co=create_char(name,0);
				if (!co) break;
	
				if (item_drop_char(in,co)) {
					
					ch[co].tmpx=pos[n*2];
					ch[co].tmpy=pos[n*2+1];
					
					update_char(co);
					
					ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE;
					ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE;
					ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE;
					
					ch[co].dir=DX_RIGHTDOWN;
		
					*(unsigned short*)(it[in].drdata+4+n*4)=co;
					*(unsigned short*)(it[in].drdata+6+n*4)=ch[co].serial;
					break;	// only one spawn per call
				} else {
					destroy_char(co);
					break;
				}
			}
		}
		call_item(it[in].driver,in,0,ticker+TICKS*10);
	} else if (nr==1) {
		static int pos[100]={0},co_nr[100],serial[100],maxpos=0;

		if (!maxpos) {
			for (n=1; n<MAXITEM; n++) {
				if (!it[n].flags) continue;
				if (it[n].driver!=IDR_EDEMONLIGHT) continue;
				if (it[n].drdata[0]!=4) continue;
                                pos[maxpos++]=it[n].x+it[n].y*MAXMAP;
			}
		}
		for (n=0; n<maxpos; n++) {
			if (!(co=co_nr[n]) || !ch[co].flags || ch[co].serial!=serial[n]) {
				co=create_char("edemon6s",0);
				if (!co) break;

				if (item_drop_char(in,co)) {
					
					ch[co].tmpx=pos[n]%MAXMAP;
					ch[co].tmpy=pos[n]/MAXMAP;
					
					update_char(co);
					
					ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE;
					ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE;
					ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE;
					
					ch[co].dir=DX_RIGHTDOWN;
		
					co_nr[n]=co;
					serial[n]=ch[co].serial;
					break;	// only one spawn per call
				} else {
					destroy_char(co);
					break;
				}
			}
		}
		call_item(it[in].driver,in,0,ticker+TICKS*20);
	}		
}
示例#11
0
void minewall(int in,int cn)
{
	int in2,amount,co;
	char buf[80];

        if (!cn) {
		if (!it[in].drdata[4]) {
                        it[in].drdata[4]=1;
			switch((it[in].x+it[in].y)%3) {
				case 0:		it[in].sprite=15070; break;
				case 1:		it[in].sprite=15078; break;
				case 2:		it[in].sprite=15086; break;
			}
			
		}

                if (it[in].drdata[3]==8) {
			if ((map[it[in].x+it[in].y*MAXMAP].flags&MF_TMOVEBLOCK) || map[it[in].x+it[in].y*MAXMAP].it) {
				call_item(it[in].driver,in,0,ticker+TICKS);
				return;
			}
			it[in].sprite-=8;
			it[in].drdata[3]=0;
			it[in].flags|=IF_USE;
			it[in].flags&=~IF_VOID;
			
			remove_lights(it[in].x,it[in].y);
			map[it[in].x+it[in].y*MAXMAP].it=in;
			map[it[in].x+it[in].y*MAXMAP].flags|=MF_TSIGHTBLOCK|MF_TMOVEBLOCK;
			it[in].flags|=IF_SIGHTBLOCK;
			reset_los(it[in].x,it[in].y);
			add_lights(it[in].x,it[in].y);
                        set_sector(it[in].x,it[in].y);
		}
		return;
	}

	if (ch[cn].citem) {
		log_char(cn,LOG_SYSTEM,0,"Please empty your hand (mouse cursor) first.");
		player_driver_dig_off(cn);
		return;
	}
	
	
	if (it[in].drdata[3]<9) {
		if (ch[cn].endurance<POWERSCALE) {
			log_char(cn,LOG_SYSTEM,0,"You're too exhausted to continue digging.");
			player_driver_dig_off(cn);
			return;
		}
		ch[cn].endurance-=POWERSCALE/4-(ch[cn].prof[P_MINER]*POWERSCALE/(4*25));

                it[in].drdata[3]++;
		it[in].drdata[5]=0;
		it[in].sprite++;
		
		if (it[in].drdata[3]==8) {
                        map[it[in].x+it[in].y*MAXMAP].it=0;
			map[it[in].x+it[in].y*MAXMAP].flags&=~MF_TMOVEBLOCK;
			it[in].flags&=~IF_USE;
			it[in].flags|=IF_VOID;
			call_item(it[in].driver,in,0,ticker+TICKS*60*5+RANDOM(TICKS*60*25));

			if (!RANDOM(15)) {
				in2=create_item("silver");
				if (!in2) elog("silver not found");

				amount=RANDOM(it[in].drdata[0]*2+1)+it[in].drdata[0];
				//xlog("amount=%d",amount);
				if (ch[cn].prof[P_MINER]) amount+=amount*ch[cn].prof[P_MINER]/10;
				//xlog("amount=%d",amount);
				if (!amount && in2) {
					destroy_item(in2);
				}
			} else if (!RANDOM(50)) {
				in2=create_item("gold");
				if (!in2) elog("gold not found");

				amount=RANDOM(it[in].drdata[1]*2+1)+it[in].drdata[1];
				if (ch[cn].prof[P_MINER]) amount+=amount*ch[cn].prof[P_MINER]/10;
				if (!amount && in2) {
					destroy_item(in2);
				}
			} else amount=in2=0;

			if (amount && in2) {
				it[in2].value*=amount;
				*(unsigned int*)(it[in2].drdata+1)=amount;
				sprintf(it[in2].description,"%d units of %s.",*(unsigned int*)(it[in2].drdata+1),it[in2].name);

				if (ch[cn].flags&CF_PLAYER) dlog(cn,in2,"took from minewall");
				ch[cn].citem=in2;
				it[in2].carried=cn;
				ch[cn].flags|=CF_ITEMS;

				log_char(cn,LOG_SYSTEM,0,"You found %d units of %s.",amount,it[in2].name);

				if (it[in2].drdata[0]==1) check_military_silver(cn,amount);
			}

			if (!RANDOM(10)) {
				sprintf(buf,"miner%d",it[in].drdata[2]);
				co=create_char(buf,0);
				if (!co) elog("%s not found",buf);

				if (co) {
					if (drop_char(co,it[in].x,it[in].y,0)) {
						ch[co].tmpx=ch[co].x;
						ch[co].tmpy=ch[co].y;
						
						update_char(co);
						
						ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE;
						ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE;
						ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE;
						
						ch[co].dir=DX_RIGHTDOWN;
					} else {
						destroy_char(co);
					}
				}
			}
		}
		
		set_sector(it[in].x,it[in].y);

		if (it[in].drdata[3]==3) {
			remove_lights(it[in].x,it[in].y);
			map[it[in].x+it[in].y*MAXMAP].flags&=~MF_TSIGHTBLOCK;
			it[in].flags&=~IF_SIGHTBLOCK;
			reset_los(it[in].x,it[in].y);
			add_lights(it[in].x,it[in].y);
		}
	}
	
	if (it[in].drdata[3]<8) player_driver_dig_on(cn);
	else player_driver_dig_off(cn);
}
示例#12
0
/*! 
 *  \brief     Parse from Client
 *  
 *  \author    Fimbulwinter Development Team
 *  \author    GreenBox
 *  \date      08/12/11
 *
 **/
int CharServer::parse_from_client(tcp_connection::pointer cl)
{
	CharSessionData *csd = ((CharSessionData *)cl->get_data());

	if (cl->flags.eof)
	{
		if (csd && csd->auth && auth_conn_ok)
		{
			WFIFOHEAD(auth_conn,6);
			WFIFOW(auth_conn,0) = INTER_CA_SET_ACC_OFF;
			WFIFOL(auth_conn,2) = csd->account_id;
			auth_conn->send_buffer(6);
		}

		set_char_offline(csd->account_id, -1);

		if (csd)
			delete csd;

		ShowInfo("Closed connection from '"CL_WHITE"%s"CL_RESET"'.\n", cl->socket().remote_endpoint().address().to_string().c_str());
		cl->do_close();
		return 0;
	}

	while(RFIFOREST(cl) >= 2)
	{
		unsigned short cmd = RFIFOW(cl, 0);

#define FIFOSD_CHECK(rest) { if(RFIFOREST(cl) < rest) return 0; if (csd==NULL || !csd->auth) { cl->skip(rest); return 0; } }

		switch (cmd)
		{
		case HEADER_CH_SELECT_CHAR:
			FIFOSD_CHECK(3);
			{
				int slot = RFIFOB(cl,2);
				int char_id;
				CharData cd;

				cl->skip(3);

				{
					statement s = (database->prepare << "SELECT `char_id` FROM `char` WHERE `account_id`=:a AND `char_num`=:s",
						use(csd->account_id), use(slot), into(char_id));

					s.execute(true);

					if (s.get_affected_rows() <= 0)
					{
						WFIFOPACKET(cl, spacket, HC_REFUSE_ENTER);
						spacket->error_code = 0;
						cl->send_buffer(sizeof(struct PACKET_HC_REFUSE_ENTER));
					}
				}

				chars->load_char(char_id, cd, true);

				int server = -1;
				if (map_to_zone.count(cd.last_point.map))
					server = map_to_zone[cd.last_point.map];

				if (server < 0)
				{
					// TODO: Find for major city

					WFIFOPACKET(cl, spacket, SC_NOTIFY_BAN);
					spacket->error_code = 1;
					cl->send_buffer(sizeof(struct PACKET_SC_NOTIFY_BAN));
					break;
				}

				auth_nodes[csd->account_id].sex = csd->sex;
				auth_nodes[csd->account_id].char_id = char_id;
				auth_nodes[csd->account_id].gmlevel = csd->gmlevel;
				auth_nodes[csd->account_id].login_id1 = csd->login_id1;
				auth_nodes[csd->account_id].login_id2 = csd->login_id2;
				auth_nodes[csd->account_id].expiration_time = csd->expiration_time;

				WFIFOPACKET(cl, spacket, HC_NOTIFY_ZONESVR);
				spacket->char_id = char_id;
				maps.copy_map_name_ext((char*)spacket->map_name, cd.last_point.map);
				spacket->addr.ip = htonl(servers[server].addr.to_ulong());
				spacket->addr.port = servers[server].port;
				cl->send_buffer(sizeof(struct PACKET_HC_NOTIFY_ZONESVR));
			}
			break;

		case HEADER_CH_REQUEST_DEL_TIMER:
			FIFOSD_CHECK(6);
			delete2_req(cl, csd);
			cl->skip(6);
			break;

		case HEADER_CH_ACCEPT_DEL_REQ:
			FIFOSD_CHECK(12);
			delete2_accept(cl, csd);
			cl->skip(6);
			break;

		case HEADER_CH_CANCEL_DEL_REQ:
			FIFOSD_CHECK(6);
			delete2_cancel(cl, csd);
			cl->skip(6);
			break;

		case HEADER_CH_DELETE_CHAR:
		case HEADER_CH_DELETE_CHAR2:
			if (cmd == HEADER_CH_DELETE_CHAR) FIFOSD_CHECK(sizeof(struct PACKET_CH_DELETE_CHAR));
			if (cmd == HEADER_CH_DELETE_CHAR2) FIFOSD_CHECK(sizeof(struct PACKET_CH_DELETE_CHAR2));
			{
				int cid = RFIFOL(cl,2);
				char email[40];
				memcpy(email, RFIFOP(cl,6), 40);

				cl->skip((cmd == HEADER_CH_DELETE_CHAR) ? sizeof(struct PACKET_CH_DELETE_CHAR) : sizeof(struct PACKET_CH_DELETE_CHAR2));

				if (_strcmpi(email, csd->email) != 0 && (strcmp("*****@*****.**", csd->email) || (strcmp("*****@*****.**", email) && strcmp("", email))))
				{
					WFIFOPACKET(cl, spacket, HC_REFUSE_DELETECHAR); 
					spacket->error_code = 0;
					cl->send_buffer(sizeof(struct PACKET_HC_REFUSE_DELETECHAR));
					break;
				}

				bool found = false;
				int i, ch;
				for (i = 0; i < MAX_CHARS; i++)
				{
					if (csd->found_char[i] == cid)
					{
						found = true;
						break;
					}
				}

				if (!found)
				{
					WFIFOPACKET(cl, spacket, HC_REFUSE_DELETECHAR); 
					spacket->error_code = 0;
					cl->send_buffer(sizeof(struct PACKET_HC_REFUSE_DELETECHAR));
					break;
				}
				else
				{
					for(ch = i; ch < MAX_CHARS - 1; ch++)
						csd->found_char[ch] = csd->found_char[ch+1];

					csd->found_char[MAX_CHARS - 1] = -1;

					if (!chars->delete_char(cid))
					{
						WFIFOPACKET(cl, spacket, HC_REFUSE_DELETECHAR); 
						spacket->error_code = 0;
						cl->send_buffer(sizeof(struct PACKET_HC_REFUSE_DELETECHAR));
						break;
					}

					WFIFOPACKET(cl, spacket, HC_ACCEPT_DELETECHAR);
					cl->send_buffer(sizeof(struct PACKET_HC_ACCEPT_DELETECHAR));
				}
			}
			break;

		case HEADER_CH_MAKE_CHAR:
			FIFOSD_CHECK(sizeof(struct PACKET_CH_MAKE_CHAR));
			{
				TYPECAST_PACKET(RFIFOP(cl,0),rpacket,CH_MAKE_CHAR);

				// TODO: Check create char disabled
				int i = create_char(csd, (char*)rpacket->name,rpacket->str,rpacket->agi,rpacket->vit,rpacket->int_,rpacket->dex,rpacket->luk,rpacket->char_slot,rpacket->head_color,rpacket->head_style);

				//'Charname already exists' (-1), 'Char creation denied' (-2) and 'You are underaged' (-3)
				if (i < 0)
				{
					WFIFOPACKET(cl, spacket, HC_REFUSE_MAKECHAR);

					switch (i) {
					case -1: spacket->error_code = 0x00; break;
					case -2: spacket->error_code = 0xFF; break;
					case -3: spacket->error_code = 0x01; break;
					}

					cl->send_buffer(sizeof(struct PACKET_HC_REFUSE_MAKECHAR));
				}
				else
				{
					// retrieve data
					CharData char_dat;
					memset(&char_dat, 0, sizeof(CharData));
					chars->load_char(i, char_dat, false); //Only the short data is needed.

					// send to player
					WFIFOPACKET(cl, spacket, HC_ACCEPT_MAKECHAR);

					char_to_buf(&spacket->charinfo, &char_dat);

					cl->send_buffer(sizeof(struct PACKET_HC_ACCEPT_MAKECHAR));

					// add new entry to the chars list
					for (int n = 0; n < MAX_CHARS; n++)
					{
						if(csd->found_char[n] == -1)
							csd->found_char[n] = i; // the char_id of the new char
					}
				}
				cl->skip(sizeof(struct PACKET_CH_MAKE_CHAR));
			}
			break;

		case HEADER_CH_ENTER_CHECKBOT:
			FIFOSD_CHECK(sizeof(struct PACKET_CH_ENTER_CHECKBOT));
			{
				WFIFOPACKET(cl, spacket, HC_CHECKBOT_RESULT);
				spacket->packet_len = sizeof(struct PACKET_HC_CHECKBOT_RESULT);
				spacket->result = 1;
				cl->send_buffer(spacket->packet_len);
				cl->skip(TYPECAST_PACKET_ONCE(RFIFOP(cl,0), CH_ENTER_CHECKBOT)->packet_len);
			}
			break;

		case HEADER_CH_CHECKBOT:
			FIFOSD_CHECK(sizeof(struct PACKET_CH_CHECKBOT));
			{
				WFIFOPACKET(cl, spacket, HC_CHECKBOT_RESULT);
				spacket->packet_len = sizeof(struct PACKET_HC_CHECKBOT_RESULT);
				spacket->result = 1;
				cl->send_buffer(spacket->packet_len);
				cl->skip(TYPECAST_PACKET_ONCE(RFIFOP(cl,0), CH_CHECKBOT)->packet_len);
			}
			break;

		case HEADER_CH_ENTER:
			if(RFIFOREST(cl) < sizeof(struct PACKET_CH_ENTER))
				return 0;
			{
				int account_id = RFIFOL(cl,2);
				unsigned int login_id1 = RFIFOL(cl,6);
				unsigned int login_id2 = RFIFOL(cl,10);
				char sex = RFIFOB(cl,16);
				cl->skip(sizeof(struct PACKET_CH_ENTER));

				if (csd)
				{
					break;
				}

				csd = new CharSessionData();
				csd->account_id = account_id;
				csd->login_id1 = login_id1;
				csd->login_id2 = login_id2;
				csd->sex = sex;
				csd->auth = false;
				csd->cl = cl;
				cl->set_data((char*)csd);

				WFIFOHEAD(cl, 4);
				WFIFOL(cl,0) = account_id;
				cl->send_buffer(4);

				if (auth_nodes.count(account_id) && 
					auth_nodes[account_id].login_id1  == login_id1 &&
					auth_nodes[account_id].login_id2  == login_id2)
				{
					auth_nodes.erase(account_id);
					auth_ok(cl, csd);
				}
				else
				{
					if (auth_conn_ok)
					{
						WFIFOHEAD(auth_conn,19);
						WFIFOW(auth_conn,0) = INTER_CA_AUTH;
						WFIFOL(auth_conn,2) = csd->account_id;
						WFIFOL(auth_conn,6) = csd->login_id1;
						WFIFOL(auth_conn,10) = csd->login_id2;
						WFIFOB(auth_conn,14) = csd->sex;
						WFIFOL(auth_conn,15) = cl->tag();
						auth_conn->send_buffer(19);
					}
					else
					{
						WFIFOPACKET(cl, spacket, HC_REFUSE_ENTER);
						spacket->error_code = 0;
						cl->send_buffer(sizeof(struct PACKET_HC_REFUSE_ENTER));
					}
				}
			}
			break;

		case HEADER_PING:
			if (RFIFOREST(cl) < sizeof(PACKET_PING))
				return 0;
			cl->skip(sizeof(PACKET_PING));
			break;

		case INTER_ZC_LOGIN:
			if (RFIFOREST(cl) < 60)
				return 0;
			{
				char *user = (char*)RFIFOP(cl, 2);
				char *pass = (char*)RFIFOP(cl, 26);

				if (strcmp(user, config.inter_login_user.c_str()) || strcmp(pass, config.inter_login_pass.c_str()))
				{
					WFIFOHEAD(cl, 3);
					WFIFOW(cl, 0) = INTER_CZ_LOGIN_REPLY;
					WFIFOB(cl, 2) = 1;
					cl->send_buffer(3);
				}
				else
				{
					int id = cl->tag();
					servers[id].cl = cl;
					servers[id].addr = address_v4(ntohl(RFIFOL(cl, 54)));
					servers[id].port = ntohs(RFIFOW(cl, 58));
					servers[id].users = 0;
					
					cl->set_parser(&CharServer::parse_from_zone);
					cl->flags.server = 1;
					cl->realloc_fifo(FIFOSIZE_SERVERLINK, FIFOSIZE_SERVERLINK);

					WFIFOHEAD(cl, 3);
					WFIFOW(cl, 0) = INTER_CZ_LOGIN_REPLY;
					WFIFOB(cl, 2) = 0;
					cl->send_buffer(3);
				}

				cl->skip(60);
			}
			break;

		default:
			ShowWarning("Unknown packet 0x%04x sent from %s, closing connection.\n", cmd, cl->socket().remote_endpoint().address().to_string().c_str());
			cl->set_eof();
			return 0;
		}
	}

	return 0;
}
示例#13
0
int warptrialdoor_driver(int in,int cn)
{
    int xs,ys,xe,ye,x,y,m,in2,dx,dy,dir,co;
    struct warpfighter_data *dat;
    struct warped_ppd *ppd;

    ppd=set_data(cn,DRD_WARP_PPD,sizeof(struct warped_ppd));
    if (!ppd) return 2;	// oops...
    if (!ppd->base) ppd->base=40;

    if (!it[in].drdata[2]) {
        xs=xe=ys=ye=in2=0;

        for (x=it[in].x+1,y=it[in].y; x<it[in].x+15; x++) {
            if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) {
                in2=map[x+y*MAXMAP].it;
                xs=it[in].x;
                xe=it[in2].x;

                for (x=it[in].x+1,y=it[in].y; y<it[in].y+15; y++) {
                    if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                        ye=y;
                        break;
                    }
                }
                for (x=it[in].x+1,y=it[in].y; y>it[in].y-15; y--) {
                    if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                        ys=y;
                        break;
                    }
                }
                break;
            }
            if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break;
        }

        if (!in2) {
            for (x=it[in].x-1,y=it[in].y; x>it[in].x-15; x--) {
                if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) {
                    in2=map[x+y*MAXMAP].it;
                    xe=it[in].x;
                    xs=it[in2].x;

                    for (x=it[in].x-1,y=it[in].y; y<it[in].y+15; y++) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            ye=y;
                            break;
                        }
                    }
                    for (x=it[in].x-1,y=it[in].y; y>it[in].y-15; y--) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            ys=y;
                            break;
                        }
                    }
                    break;
                }
                if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break;
            }
        }

        if (!in2) {
            for (x=it[in].x,y=it[in].y+1; y<it[in].y+15; y++) {
                if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) {
                    in2=map[x+y*MAXMAP].it;
                    ys=it[in].y;
                    ye=it[in2].y;

                    for (x=it[in].x,y=it[in].y+1; x<it[in].x+15; x++) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            xe=x;
                            break;
                        }
                    }
                    for (x=it[in].x,y=it[in].y+1; x>it[in].x-15; x--) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            xs=x;
                            break;
                        }
                    }
                    break;
                }
                if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break;
            }
        }

        if (!in2) {
            for (x=it[in].x,y=it[in].y-1; y>it[in].y-15; y--) {
                if (map[x+y*MAXMAP].it && it[map[x+y*MAXMAP].it].driver==IDR_WARPTRIALDOOR) {
                    in2=map[x+y*MAXMAP].it;
                    ye=it[in].y;
                    ys=it[in2].y;

                    for (x=it[in].x,y=it[in].y-1; x<it[in].x+15; x++) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            xe=x;
                            break;
                        }
                    }
                    for (x=it[in].x,y=it[in].y-1; x>it[in].x-15; x--) {
                        if (map[x+y*MAXMAP].flags&MF_MOVEBLOCK) {
                            xs=x;
                            break;
                        }
                    }
                    break;
                }
                if (map[x+y*MAXMAP].flags&(MF_MOVEBLOCK|MF_TMOVEBLOCK)) break;
            }
        }

        //xlog("xs=%d, ys=%d, xe=%d, ye=%d, in=%d, in2=%d",xs,ys,xe,ye,in,in2);

        it[in].drdata[2]=xs;
        it[in].drdata[3]=ys;
        it[in].drdata[4]=xe;
        it[in].drdata[5]=ye;
        *(unsigned short*)(it[in].drdata+6)=in2;
    }

    if (!cn) return 2;

    xs=it[in].drdata[2];
    ys=it[in].drdata[3];
    xe=it[in].drdata[4];
    ye=it[in].drdata[5];
    in2=*(unsigned short*)(it[in].drdata+6);

    if (ch[cn].x>=xs && ch[cn].x<=xe && ch[cn].y>=ys && ch[cn].y<=ye) {
        log_char(cn,LOG_SYSTEM,0,"You cannot open the door from this side.");
        return 2;
    }

    for (y=ys+1; y<ye; y++) {
        for (x=xs+1,m=x+y*MAXMAP; x<xe; x++,m++) {
            if ((co=map[m].ch) && ch[co].driver!=CDR_SIMPLEBADDY) {
                log_char(cn,LOG_SYSTEM,0,"You hear fighting noises and the door won't open.");
                return 2;
            }
        }
    }
    co=create_char("warped_fighter",0);
    if (!co) {
        log_char(cn,LOG_SYSTEM,0,"Bug #319i, sorry.");
        return 2;
    }
    if (!drop_char(co,(xs+xe)/2,(ys+ye)/2,0)) {
        log_char(cn,LOG_SYSTEM,0,"Bug #319j, sorry.");
        destroy_char(co);
        return 2;
    }
    ch[co].tmpx=ch[co].x;
    ch[co].tmpy=ch[co].y;

    warped_raise(co,ppd->base);

    update_char(co);

    ch[co].hp=ch[co].value[0][V_HP]*POWERSCALE;
    ch[co].endurance=ch[co].value[0][V_ENDURANCE]*POWERSCALE;
    ch[co].mana=ch[co].value[0][V_MANA]*POWERSCALE;
    ch[co].lifeshield=ch[co].value[0][V_MAGICSHIELD]*POWERSCALE;

    ch[co].dir=DX_RIGHTDOWN;

    dat=set_data(co,DRD_WARPFIGHTER,sizeof(struct warpfighter_data));
    if (!dat) {
        log_char(cn,LOG_SYSTEM,0,"Bug #319k, sorry.");
        remove_char(co);
        destroy_char(co);
        return 2;
    }
    dir=offset2dx(it[in].x,it[in].y,it[in2].x,it[in2].y);
    if (!dir) {
        log_char(cn,LOG_SYSTEM,0,"Bug #319l, sorry.");
        remove_char(co);
        destroy_char(co);
        return 2;
    }
    dx2offset(dir,&dx,&dy,NULL);

    dat->co=cn;
    dat->cser=ch[cn].serial;
    dat->tx=it[in2].x+dx;
    dat->ty=it[in2].y+dy;
    dat->xs=xs;
    dat->xe=xe;
    dat->ys=ys;
    dat->ye=ye;

    teleport_char_driver(cn,it[in].x+dx,it[in].y+dy);

    return 1;
}