void AttackStuff(NXWSOCKET s, P_CHAR victim) { if ( s < 0 || s >= now ) return; P_CHAR attacker = MAKE_CHAR_REF( currchar[s] ); VALIDATEPC( attacker ); VALIDATEPC( victim ); if( attacker->getSerial32() == victim->getSerial32() ) return; if ( attacker->amxevents[EVENT_CHR_ONBEGINATTACK]) { g_bByPass = false; attacker->amxevents[EVENT_CHR_ONBEGINATTACK]->Call( attacker->getSerial32(), victim->getSerial32() ); if (g_bByPass==true) return; } if ( victim->amxevents[EVENT_CHR_ONBEGINDEFENSE]) { g_bByPass = false; victim->amxevents[EVENT_CHR_ONBEGINDEFENSE]->Call( victim->getSerial32(), attacker->getSerial32() ); if (g_bByPass==true) return; } /* attacker->runAmxEvent( EVENT_CHR_ONBEGINATTACK, attacker->getSerial32(), victim->getSerial32() ); if (g_bByPass==true) return; victim->runAmxEvent( EVENT_CHR_ONBEGINDEFENSE, victim->getSerial32(), attacker->getSerial32() ); if (g_bByPass==true) return; */ attacker->targserial=victim->getSerial32(); attacker->unHide(); attacker->disturbMed(); if( victim->dead || victim->hp <= 0 )//AntiChrist { attacker->sysmsg( TRANSLATE("That person is already dead!") ); return; } if ( victim->npcaitype==NPCAI_PLAYERVENDOR) { attacker->sysmsg( TRANSLATE("%s cannot be harmed."), victim->getCurrentNameC() ); return; } SndAttackOK(s, victim->getSerial32()); //keep the target highlighted if (!( victim->targserial== INVALID)) { victim->attackerserial=attacker->getSerial32(); victim->ResetAttackFirst(); } attacker->SetAttackFirst(); attacker->attackerserial=victim->getSerial32(); if( victim->guarded ) { NxwCharWrapper sc; sc.fillOwnedNpcs( victim, false, false ); for ( sc.rewind(); !sc.isEmpty(); sc++ ) { P_CHAR guard = sc.getChar(); if ( ISVALIDPC( guard ) ) if ( guard->npcaitype == NPCAI_PETGUARD && ( attacker->distFrom( guard )<= 10 ) ) npcattacktarget(attacker, guard); } } if ((region[ victim->region].priv & RGNPRIV_GUARDED) && (SrvParms->guardsactive)) { if (victim->IsGrey()) attacker->SetGrey(); if (victim->npc==0 && victim->IsInnocent() && (!victim->IsGrey()) && Guildz.compareGuilds( attacker->getGuild(), victim->getGuild() )==0) //REPSYS { criminal( attacker ); if (ServerScp::g_nInstantGuard==1) npcs::SpawnGuard(attacker, victim,attacker->getPosition() ); } else if( victim->npc && victim->IsInnocent() && !victim->HasHumanBody() && victim->npcaitype!=NPCAI_TELEPORTGUARD ) { criminal( attacker ); if (ServerScp::g_nInstantGuard==1) npcs::SpawnGuard(attacker, victim, attacker->getPosition() ); } else if( victim->npc && victim->IsInnocent() && victim->HasHumanBody() && victim->npcaitype!=NPCAI_TELEPORTGUARD ) { victim->talkAll( TRANSLATE("Help! Guards! I've been attacked!"), 1); criminal( victim ); callguards(DEREF_P_CHAR(victim)); // Sparhawk must check if npcs can call guards } else if( victim->npc && victim->npcaitype==NPCAI_TELEPORTGUARD) { criminal( attacker ); npcattacktarget(victim, attacker); } else if ((victim->npc || victim->tamed) && !victim->war && victim->npcaitype!=NPCAI_TELEPORTGUARD) { victim->fight( attacker ); } else { victim->setNpcMoveTime(); } //attacker->emoteall( "You see %s attacking %s!", 1, attacker->getCurrentNameC(), victim->getCurrentNameC() ); } else // not a guarded area { if ( victim->IsInnocent()) { if ( victim->IsGrey()) attacker->SetGrey(); if (!victim->npc && (!victim->IsGrey()) && Guildz.compareGuilds(attacker->getGuild(), victim->getGuild() )==0) { criminal( attacker ); } else if (victim->npc && victim->tamed) { criminal( attacker ); npcattacktarget(victim, attacker); } else if (victim->npc) { criminal( attacker ); npcattacktarget(victim, attacker); if (victim->HasHumanBody() ) { victim->talkAll(TRANSLATE("Help! Guards! Tis a murder being commited!"), 1); } } } } }
void RcvAttack(P_CLIENT ps) { UOXSOCKET s = ps->GetSocket(); P_CHAR pc_currchar = ps->getPlayer(); int j; SERIAL serial=calcserial(buffer[s][1],buffer[s][2],buffer[s][3],buffer[s][4]); if(serial == INVALID_SERIAL) return; P_CHAR pc_i = FindCharBySerPtr(&buffer[s][1]); if(pc_i == NULL) return; //to avoid problems if(pc_currchar->dead)//AntiChrist stuff { if(SrvParams->persecute()) {//start persecute stuff - AntiChrist pc_currchar->targ = pc_i->serial; if(pc_currchar->targ==INVALID_SERIAL) return; else Skills->Persecute(s); return; } else { sysmessage(s,"You are dead and cannot do that."); return; } } if(pc_currchar->cell>0) { sysmessage(s,"There is no fighting in the jail cells!"); return; } if(!pc_currchar->dead) { pc_currchar->targ = serial; pc_currchar->unhide(); pc_currchar->disturbMed(s); if(pc_i->dead || pc_i->hp<=0)//AntiChrist { sysmessage(s,"That person is already dead!"); return; } if (pc_i->npcaitype==17)//PlayerVendors { sprintf((char*)temp, "%s cannot be harmed.",pc_i->name.c_str()); sysmessage(s, (char*)temp); return; } SndAttackOK(s, pc_i->serial); //keep the target highlighted if (!(pc_i->targ == INVALID_SERIAL)) { pc_i->attacker = pc_currchar->serial; pc_i->resetAttackFirst(); } pc_currchar->setAttackFirst(); pc_currchar->attacker = pc_i->serial; pc_currchar->dir = chardir(pc_currchar, pc_i); // turn to attacker, LB (& Duke) updatechar(pc_currchar); if( pc_i->guarded ) { AllCharsIterator iter_char; for (iter_char.Begin(); !iter_char.atEnd(); iter_char++) { P_CHAR toCheck = iter_char.GetData(); if (pc_i->Owns(toCheck) && toCheck->npcaitype == 32 && chardist( pc_currchar, toCheck )<= 10 ) { npcattacktarget( pc_currchar, toCheck ); } } } if (pc_i->inGuardedArea() && SrvParams->guardsActive()) { if (pc_i->isPlayer() && pc_i->isInnocent() && GuildCompare( pc_currchar, pc_i )==0) //REPSYS { criminal( pc_currchar ); Combat->SpawnGuard(pc_currchar, pc_i ,pc_currchar->pos.x,pc_currchar->pos.y,pc_currchar->pos.z); } else if( pc_i->isNpc() && pc_i->isInnocent() && !pc_i->isHuman() && pc_i->npcaitype!=4 ) { criminal( pc_currchar ); Combat->SpawnGuard(pc_currchar, pc_i, pc_currchar->pos.x,pc_currchar->pos.y,pc_currchar->pos.z); } else if( pc_i->isNpc() && pc_i->isInnocent() && pc_i->isHuman() && pc_i->npcaitype!=4 ) { npctalkall(pc_i, "Help! Guards! I've been attacked!", 1); criminal( pc_currchar ); callguards(pc_i); } else if( pc_i->isNpc() && pc_i->npcaitype==4) { criminal( pc_currchar ); npcattacktarget(pc_i, pc_currchar); } else if ((pc_i->isNpc() || pc_i->tamed) && !pc_i->war && pc_i->npcaitype!=4) // changed from 0x40 to 4, cauz 0x40 was removed LB { npcToggleCombat(pc_i); pc_i->setNextMoveTime(); } else { pc_i->setNextMoveTime(); } sprintf((char*)temp, "You see %s attacking %s!", pc_currchar->name.c_str(), pc_i->name.c_str()); for (j=0;j<now;j++) { if((inrange1(s, j) && perm[j]) && (s!=j)) { pc_i->emotecolor = 0x0026; npcemote(j, pc_currchar, (char*)temp,1); } } } else // not a guarded area { if (pc_i->isInnocent()) { if (pc_i->isPlayer() && GuildCompare( pc_currchar, pc_i )==0) { criminal( pc_currchar ); } else if (pc_i->isNpc() && pc_i->tamed) { criminal( pc_currchar ); npcattacktarget(pc_i, pc_currchar); } else if (pc_i->isNpc()) { criminal( pc_currchar ); npcattacktarget(pc_i, pc_currchar); if (pc_i->isHuman() ) { npctalkall(pc_i, "Help! Guards! Tis a murder being commited!", 1); } } } } } }