/** Can player pemit to target? * You can pemit if you're pemit_all, if you're pemitting to yourself, * if you're pemitting to a non-player, or if you pass target's * pagelock and target isn't HAVEN. * \param player dbref attempting to pemit. * \param target target dbref to pemit to. * \param dofails If nonzero, send failure message 'def' or run fail_lock() * \param def show a default message if there is no appropriate failure message? * \param pe_info the pe_info for page lock evaluation * \retval 1 player may pemit to target. * \retval 0 player may not pemit to target. */ int okay_pemit(dbref player, dbref target, int dofails, int def, NEW_PE_INFO *pe_info) { char defmsg[BUFFER_LEN]; char *dp = NULL; if (Pemit_All(player)) return 1; if (dofails && def) { dp = defmsg; safe_format(defmsg, &dp, T("I'm sorry, but %s wishes to be left alone now."), AName(target, AN_SYS, NULL)); *dp = '\0'; dp = defmsg; } if (IsPlayer(target) && Haven(target)) { if (dofails && def) notify(player, dp); return 0; } if (!eval_lock_with(player, target, Page_Lock, pe_info)) { if (dofails) { fail_lock(player, target, Page_Lock, dp, NOTHING); } return 0; } return 1; }
/** Autoreply messages for pages (HAVEN, IDLE, AWAY). * \param player the paging player. * \param target the paged player. * \param type type of message to return. * \param message name of attribute containing the message. * \param def default message to return. */ void page_return(dbref player, dbref target, const char *type, const char *message, const char *def) { char buff[BUFFER_LEN]; struct tm *ptr; if (message && *message) { if (call_attrib(target, message, buff, player, NULL, NULL)) { if (*buff) { ptr = (struct tm *) localtime(&mudtime); notify_format(player, T("%s message from %s: %s"), type, AName(target, AN_SYS, NULL), buff); if (!Haven(target)) notify_format(target, T("[%d:%02d] %s message sent to %s."), ptr->tm_hour, ptr->tm_min, type, AName(player, AN_SYS, NULL)); } } else if (def && *def) notify(player, def); } }
void do_kill (dbref player, dbref cause, int key, char *what, char *costchar) { dbref victim; char *buf1, *buf2; int cost; init_match(player, what, TYPE_PLAYER); match_neighbor(); match_me(); match_here(); if (Wizard(player)) { match_player(); match_absolute(); } victim = match_result(); switch (victim) { case NOTHING: notify(player, "I don't see that player here."); break; case AMBIGUOUS: notify(player, "I don't know who you mean!"); break; default: if ((Typeof(victim) != TYPE_PLAYER) && (Typeof(victim) != TYPE_THING)) { notify(player, "Sorry, you can only kill players and things."); break; } if ((Haven(Location(victim)) && !Wizard(player)) || (controls(victim, Location(victim)) && !controls(player, Location(victim))) || Immortal(victim)) { notify(player, "Sorry."); break; } if (key == KILL_SLAY) { if (Builder(player) && Builder(victim)) { notify(player, "Sorry."); break; } } /* go for it */ cost = atoi(costchar); if (key == KILL_KILL) { if (HasPriv(victim,player,POWER_NOKILL,POWER4,NOTHING)) { notify(player, "Sorry."); break; } if (cost < mudconf.killmin) cost = mudconf.killmin; if (cost > mudconf.killmax) cost = mudconf.killmax; /* see if it works */ if (!payfor(player, cost)) { notify(player, unsafe_tprintf("You don't have enough %s.", mudconf.many_coins)); return; } } else { cost = 0; } if (!(((random() % mudconf.killguarantee) < cost) || (key == KILL_SLAY)) || Wizard(victim)) { /* Failure: notify player and victim only */ notify(player, "Your murder attempt failed."); buf1 = alloc_lbuf("do_kill.failed"); sprintf(buf1, "%s tried to kill you!", Name(player)); notify_with_cause(victim, player, buf1); if (Suspect(player)) { strcpy(buf1, Name(player)); if (player == Owner(player)) { raw_broadcast(0, WIZARD, "[Suspect] %s tried to kill %s(#%d).", buf1, Name(victim), victim); } else { buf2 = alloc_lbuf("do_kill.SUSP.failed"); strcpy(buf2, Name(Owner(player))); raw_broadcast(0, WIZARD, "[Suspect] %s <via %s(#%d)> tried to kill %s(#%d).", buf2, buf1, player, Name(victim), victim); free_lbuf(buf2); } } free_lbuf(buf1); break; } /* Success! You killed him */ buf1 = alloc_lbuf("do_kill.succ.1"); buf2 = alloc_lbuf("do_kill.succ.2"); if (Suspect(player)) { strcpy(buf1, Name(player)); if (player == Owner(player)) { raw_broadcast(0, WIZARD, "[Suspect] %s killed %s(#%d).", buf1, Name(victim), victim); } else { strcpy(buf2, Name(Owner(player))); raw_broadcast(0, WIZARD, "[Suspect] %s <via %s(#%d)> killed %s(#%d).", buf2, buf1, player, Name(victim), victim); } } sprintf(buf1, "You killed %s!", Name(victim)); sprintf(buf2, "killed %s!", Name(victim)); if (Typeof(victim) != TYPE_PLAYER) if (halt_que(NOTHING, victim) > 0) if (!Quiet(victim)) notify(Owner(victim), "Halted."); did_it(player, victim, A_KILL, buf1, A_OKILL, buf2, A_AKILL, (char **)NULL, 0); /* notify victim */ sprintf(buf1, "%s killed you!", Name(player)); notify_with_cause(victim, player, buf1); /* Pay off the bonus */ if (key == KILL_KILL) { cost /= 2; /* victim gets half */ if (Pennies(Owner(victim)) < mudconf.paylimit) { sprintf(buf1, "Your insurance policy pays %d %s.", cost, mudconf.many_coins); notify(victim, buf1); giveto(Owner(victim), cost, NOTHING); } else { notify(victim, "Your insurance policy has been revoked."); } } free_lbuf(buf1); free_lbuf(buf2); /* send him home */ move_via_generic(victim, HOME, NOTHING, 0); divest_object(victim); break; } }