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; }
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); }
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); }
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; }