Ejemplo n.º 1
0
int monksout(int cn, struct saltmine_ppd *ppd)
{
        int co;
        struct saltmine_worker_data *workerdat;

        if ((co=getfirst_char())) do {
                if (ch[co].driver!=CDR_MONK_WORKER) continue;
                if (!(workerdat=set_data(co,DRD_SALTMINE_WORKER,sizeof(struct saltmine_worker_data)))) continue;
                if (workerdat->follow_cn!=cn) continue;
                return 1;
        } while((co=getnext_char(co)));

        return 0;
}
Ejemplo n.º 2
0
Archivo: swear.c Proyecto: NightSoA/soa
void shutup_bg(int cnID,int coID,int minutes)
{
	struct swear_ppd *ppd;
	int co;

	for (co=getfirst_char(); co; co=getnext_char(co)) {
		if (ch[co].ID==coID) break;		
	}
	if (!co) return;

	if (!(ch[co].flags&CF_PLAYER)) return;

	ppd=set_data(co,DRD_SWEAR_PPD,sizeof(struct swear_ppd));
	if (!ppd) return;	// oops...

	ppd->banned_till=realtime+(minutes*60);

        if (minutes>0) log_char(co,LOG_SYSTEM,0,"°c3Your ability to talk has been disabled.");
	else log_char(co,LOG_SYSTEM,0,"°c3Your ability to talk has been enabled.");

	tell_chat(0,cnID,1,"%s cannot talk for %d minutes.",ch[co].name,minutes);
}
Ejemplo n.º 3
0
void clubmaster_driver(int cn,int ret,int lastact)
{
	struct clubmaster_driver_data *dat;
        int co,in,n,rank,cc,val;
        struct msg *msg,*next;
	char *ptr,tmp[80],name[80];

        dat=set_data(cn,DRD_CLUBMASTERDRIVER,sizeof(struct clubmaster_driver_data));
	if (!dat) return;	// oops...

        if (ch[cn].arg) {
                clubmaster_driver_parse(cn,dat);
		ch[cn].arg=NULL;
	}

        // loop through our messages
	for (msg=ch[cn].msg; msg; msg=next) {
		next=msg->next;

		// did we see someone?
		if (msg->type==NT_CHAR) {
			
                        co=msg->dat1;

			// dont talk to someone we cant see, and dont talk to ourself
			if (!char_see_char(cn,co) || cn==co) { remove_message(cn,msg); continue; }

			// dont talk to someone far away
			if (char_dist(cn,co)>10) { remove_message(cn,msg); continue; }

			// dont talk to the same person twice
			if (mem_check_driver(cn,co,7)) { remove_message(cn,msg); continue; }

			if (!get_char_club(cn) && !get_char_clan(cn)) quiet_say(cn,"Hello %s! Would you like to found a °c4club°c0?",ch[co].name);
			mem_add_driver(cn,co,7);
		}

                // talk back
		if (msg->type==NT_TEXT) {
			analyse_text_driver(cn,msg->dat1,(char*)msg->dat2,msg->dat3);

                        if ((msg->dat1==1 || msg->dat1==2) && (co=msg->dat3)!=cn) {	// talk, and not our talk				
                                if ((ptr=strcasestr((char*)msg->dat2,"found:"))) {
					if (!(ch[co].flags&CF_PAID)) {
						quiet_say(cn,"I'm sorry, %s, but only paying players may found clubs.",ch[co].name);
					} else if (!get_char_clan(co) && !get_char_club(co)) {
						if (ch[co].gold>=10000*100) {
							ptr+=6;
							while (isspace(*ptr)) ptr++;
							for (n=0; n<79; n++) {
								if (!(isalpha(*ptr) || *ptr==' ')) break;
								name[n]=*ptr++;
							}
							name[n]=0;
							
							if ((n=create_club(name))) {
								take_money(co,10000*100);
								ch[co].clan=n+CLUBOFFSET;
								ch[co].clan_serial=club[n].serial;
								ch[co].clan_rank=2;
								quiet_say(cn,"Congratulations, %s, you are now the leader of the club %s.",ch[co].name,club[n].name);
								dlog(co,0,"created club %d %s",n,club[n].name);
							} else quiet_say(cn,"Something's wrong with the name.");
						} else quiet_say(cn,"You cannot pay the fee of 10,000 gold.");
					} else quiet_say(cn,"You are already a member of a clan or club. You cannot found a new one.");
				}
				if ((ptr=strcasestr((char*)msg->dat2,"accept:"))) {
					if (!get_char_club(co) || ch[co].clan_rank<1) {
                                                quiet_say(cn,"You are not a club leader, %s.",ch[co].name);
					} else {
						ptr+=7;
						while (isspace(*ptr)) ptr++;
						for (n=0; n<79; n++) {
							if (!*ptr || *ptr=='"') break;
							dat->accept[n]=*ptr++;
						}
						dat->accept[n]=0;
						strcpy(dat->join,ch[co].name);
						dat->accept_clan=get_char_club(co);
						dat->accept_cn=co;

						quiet_say(cn,"To join %s's club %s, say: 'join: %s'",dat->join,dat->accept,dat->join);
					}
				}
				if ((ptr=strcasestr((char*)msg->dat2,"join:"))) {
					if (get_char_clan(co) || get_char_club(co)) {
                                                quiet_say(cn,"You are already a clan or club member, %s.",ch[co].name);
					} else {
						ptr+=5;
						while (isspace(*ptr)) ptr++;
						for (n=0; n<79; n++) {
							if (!*ptr || *ptr=='"') break;
							tmp[n]=*ptr++;
						}
						tmp[n]=0;
                                                if (strcasecmp(dat->accept,ch[co].name)) {
							quiet_say(cn,"You have not been invited, %s.",ch[co].name);
						} else if (strcasecmp(dat->join,tmp)) {
							quiet_say(cn,"%s has not invited you, %s.",tmp,ch[co].name);
						} else {
                                                        //add_member(co,dat->accept_clan,dat->join);
							ch[co].clan=dat->accept_clan+CLUBOFFSET;
							ch[co].clan_serial=club[dat->accept_clan].serial;
							ch[co].clan_rank=0;
							quiet_say(cn,"%s, you are now a member of %s's club.",ch[co].name,dat->join);
							dat->accept[0]=0;
							dat->accept_clan=0;
							dat->join[0]=0;
						}
						
					}
				}
				if ((ptr=strcasestr((char*)msg->dat2,"leave!"))) {
					if (!get_char_club(co)) {
                                                quiet_say(cn,"You are not a club member, %s.",ch[co].name);
					} else {
						remove_member(co,co);
						quiet_say(cn,"You are no longer a member of any club, %s",ch[co].name);
					}
				}
				if ((ptr=strcasestr((char*)msg->dat2,"rank:"))) {
					if (!get_char_club(co) || ch[co].clan_rank<2) {
                                                quiet_say(cn,"You are not a club founder, %s.",ch[co].name);
					} else {
						ptr+=6;
						while (isspace(*ptr)) ptr++;
						for (n=0; n<79; n++) {
							if (!*ptr || *ptr=='"' || isspace(*ptr)) break;
							tmp[n]=*ptr++;
						}
						tmp[n]=0;
						
						rank=atoi(ptr);

						if (rank<0 || rank>1) {
							quiet_say(cn,"You must use a rank between 0 and 1.");
							remove_message(cn,msg);
							continue;
						}

						for (cc=getfirst_char(); cc; cc=getnext_char(cc)) {
							if (!strcasecmp(tmp,ch[cc].name) && (ch[cc].flags&CF_PLAYER)) break;
						}
						if (cc) {
							if (!(ch[cc].flags&CF_PAID) && rank>0) {
                                                                quiet_say(cn,"%s is not a paying player, you cannot set the rank higher than 0.",ch[cc].name);
							} else if (ch[cc].clan_rank==2) {
								quiet_say(cn,"%s is the club's founder, cannot change rank.",ch[cc].name);
							} else if (get_char_club(cc)==get_char_club(co)) {
								ch[cc].clan_rank=rank;
								quiet_say(cn,"Set %s's rank to %d.",ch[cc].name,rank);
							} else quiet_say(cn,"You cannot change the rank of those not belonging to your club.");
						} else {
							int uID;

							uID=lookup_name(tmp,NULL);
							if (uID==0) continue;
							if (uID==-1) {
								quiet_say(cn,"Sorry, no player by the name %s found.",tmp);
							} else {
								task_set_clan_rank(uID,ch[co].ID,get_char_club(co)+CLUBOFFSET,rank,ch[co].name);
								quiet_say(cn,"Update scheduled (%s,%d).",tmp,rank);
							}
						}
					}
				}
				if ((ptr=strcasestr((char*)msg->dat2,"fire:"))) {
					if (!get_char_club(co) || ch[co].clan_rank<1) {
                                                quiet_say(cn,"You are not a club leader, %s.",ch[co].name);
					} else {
						ptr+=6;
						while (isspace(*ptr)) ptr++;
						for (n=0; n<79; n++) {
							if (!*ptr || *ptr=='"' || isspace(*ptr)) break;
							tmp[n]=*ptr++;
						}
						tmp[n]=0;
						
                                                for (cc=getfirst_char(); cc; cc=getnext_char(cc)) {
							if (!strcasecmp(tmp,ch[cc].name) && (ch[cc].flags&CF_PLAYER)) break;
						}
						if (cc) {
							if (get_char_club(cc)==get_char_club(co)) {
								if (ch[cc].clan_rank<2) {
									remove_member(cc,co);
									quiet_say(cn,"Fired: %s.",ch[cc].name);
								} else quiet_say(cn,"You cannot fire the founder of the club.");
							} else quiet_say(cn,"You cannot fire those not belonging to your club.");
						} else {
							int uID;

							uID=lookup_name(tmp,NULL);
							if (uID==0) continue;
							if (uID==-1) {
								quiet_say(cn,"Sorry, no player by the name %s found.",tmp);
							} else {
								task_fire_from_clan(uID,ch[co].ID,get_char_club(co)+CLUBOFFSET,ch[co].name);
								quiet_say(cn,"Update scheduled (%s).",tmp);
							}
						}
					}
				}

				if ((ptr=strcasestr((char*)msg->dat2,"deposit:"))) {
					if (!(n=get_char_club(co))) {
                                                quiet_say(cn,"You are not a club member, %s.",ch[co].name);
					} else {
						val=atoi(ptr+8)*100;

						if (val>0 && ch[co].gold>=val) {
							club[n].money+=val;
							take_money(co,val);
							quiet_say(cn,"You have deposited %dG, for a total of %dG, %s.",val/100,club[n].money/100,ch[co].name);
							dlog(co,0,"Deposited %dG into club %d, for a new total of %dG",val/100,n,club[n].money/100);
							db_update_club(n);
						} else quiet_say(cn,"You do not have that much gold, %s.",ch[co].name);
					}
				}
				if ((ptr=strcasestr((char*)msg->dat2,"withdraw:"))) {
					if (!(n=get_char_club(co)) || ch[co].clan_rank<2) {
                                                quiet_say(cn,"You are not a club founder, %s.",ch[co].name);
					} else {
						val=atoi(ptr+9)*100;

						if (val>0 && club[n].money>=val) {
							club[n].money-=val;
							give_money(co,val,"club withdrawal");
							quiet_say(cn,"You have withdrawn %dG, money left in club %dG, %s.",val/100,club[n].money/100,ch[co].name);
							dlog(co,0,"Withdrew %dG from club %d, for a new total of %dG",val/100,n,club[n].money/100);
							db_update_club(n);
						} else quiet_say(cn,"The club does not have that much gold, %s.",ch[co].name);
					}
				}
			}			
		}

		// got an item?
		if (msg->type==NT_GIVE) {
			co=msg->dat1;

                        if ((in=ch[cn].citem)) {	// we still have it
				// try to give it back
                                if (give_char_item(cn,co)) return;
				
				// didnt work, let it vanish, then
				destroy_item(ch[cn].citem);
				ch[cn].citem=0;
			}
		}
                remove_message(cn,msg);
	}

        // do something. whenever possible, call do_idle with as high a tick count
	// as reasonable when doing nothing.

	if (secure_move_driver(cn,ch[cn].tmpx,ch[cn].tmpy,dat->dir,ret,lastact)) return;

        if (ticker>dat->last_talk+TICKS*60 && !RANDOM(25)) {
		switch(RANDOM(8)) {
			case 0:		murmur(cn,"My back itches."); break;
			case 1:		whisper(cn,"There's something stuck between your teeth."); break;
			case 2:		murmur(cn,"Oh yeah, those were the days."); break;
			case 3:		murmur(cn,"Now where did I put it?"); break;
			case 4:		murmur(cn,"Oh my, life is hard but unfair."); break;
                        case 5:		murmur(cn,"Beware of the fire snails!"); break;
			case 6:         murmur(cn,"I love the clicking of coins."); break;
			case 7:		murmur(cn,"Gold and Silver, Silver and Gold."); break;
			default:	break;
		}
		
		dat->last_talk=ticker;
	}

	if (ticker>dat->memcleartimer) {
		mem_erase_driver(cn,7);
		dat->memcleartimer=ticker+TICKS*60*60*12;
	}

        do_idle(cn,TICKS*2);
}
Ejemplo n.º 4
0
int set_task(struct task_data *set,int (*proc)(void*,struct character*))
{
	MYSQL_RES *result;
	MYSQL_ROW row;	
	unsigned long *len;
	int cn;
	char data[sizeof(struct character)*2];
	char buf[sizeof(data)+256];
	struct character tmp;

	xlog("set task: start for ID=%d, task=%d",set->uID,set->tasknr);

	// character online here?
	lock_server();
	for (cn=getfirst_char(); cn; cn=getnext_char(cn)) {
		if (ch[cn].ID==set->uID) break;
	}
	if (cn) {	// yes: set data and delete task
		xlog("set task: found online");
		
                proc(set,ch+cn);
                unlock_server();
                return 1;
	} else unlock_server();

	xlog("set task: checking DB for ID=%d, task=%d",set->uID,set->tasknr);
	// no? check if not online anywhere else and adjust data in database
	
	// read the data we need
        sprintf(buf,"select chr,current_area from chars where ID=%d",set->uID);
	if (mysql_query_con(&mysql,buf)) {
		elog("Failed to select account ID=%d: Error: %s (%d)",set->uID,mysql_error(&mysql),mysql_errno(&mysql));
                return 0;
	}
        if (!(result=mysql_store_result_cnt(&mysql))) {
		elog("Failed to store result: Error: %s (%d)",mysql_error(&mysql),mysql_errno(&mysql));
                return 0;
	}
	if (mysql_num_rows(result)==0) {
		elog("set_task: num_rows returned 0");
		mysql_free_result_cnt(result);
                return 0;
	}
        if (!(row=mysql_fetch_row(result))) {
		elog("set_task: fetch_row returned NULL");
		mysql_free_result_cnt(result);
                return 0;
	}
	if (!row[0] || !row[1]) {
		elog("set_task: one of the values NULL");
		mysql_free_result_cnt(result);
                return 0;
	}

	if (atoi(row[1])) {	// player is online somewhere, leave
		mysql_free_result_cnt(result);
                xlog("set task: is online somewhere else");
                return 0;
	}
	xlog("set task: updating for ID=%d, task=%d",set->uID,set->tasknr);

	len=mysql_fetch_lengths(result);

	bzero(&tmp,sizeof(tmp));
	memcpy(&tmp,row[0],min(len[0],sizeof(struct character)));

	mysql_free_result_cnt(result);

	if (proc(set,&tmp)) {

		xlog("set task: for ID=%d, task=%d",set->uID,set->tasknr);

		mysql_real_escape_string(&mysql,data,(void*)&tmp,sizeof(struct character));
	
		sprintf(buf,"update chars set chr='%s',clan=%d,clan_rank=%d,experience=%d where ID=%d",
                             data,
			     tmp.clan,
			     tmp.clan_rank,
			     tmp.exp,
			     set->uID);
	
		if (mysql_query_con(&mysql,buf)) {
			elog("Failed to update account ID=%d: Error: %s (%d)",set->uID,mysql_error(&mysql),mysql_errno(&mysql));
			return 0;
		}
#ifdef CHARINFO
		sprintf(buf,"update charinfo set clan=%d,clan_rank=%d,experience=%d where ID=%d",
			     tmp.clan,
			     tmp.clan_rank,
			     tmp.exp,
			     set->uID);
	
		if (mysql_query_con(&mysql,buf)) {
			elog("Failed to update charinfo ID=%d: Error: %s (%d)",set->uID,mysql_error(&mysql),mysql_errno(&mysql));
		}
#endif
		xlog("set task: db update done for ID=%d, task=%d",set->uID,set->tasknr);
	}

        xlog("set task: done for ID=%d, task=%d",set->uID,set->tasknr);

	return 1;
}