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); } } } } }
/*! \brief Handles a 'real move' if the char is not only changing direction \param pc Walking character \param dir Direction in which the character is moving to \param oldp Previous position of the char (in the same map) */ static bool WalkHandleBlocking(pChar pc, int sequence, uint8_t dir, sPoint oldp) { if(!pc) return false; if (pc->npc) pc->setNpcMoveTime(); //reset move timer sLocation pcpos= pc->getPosition(); pcpos.move(dir&0x07, 1); // This calculate the new position int8_t z; if ( pc->npc ) z = isWalkable( pc->getPosition(), WALKFLAG_MAP + WALKFLAG_STATIC + WALKFLAG_DYNAMIC, pc ); else z = getHeight( pc->getPosition() ); //WalkEvaluateBlockers(pc, &z, &dispz, blockers); //!\todo Should this actually be used only for npcs? Sure the owner and banned stuff, but the rest? if (pc->npc==0) // this is also called for npcs .. LB ?????? Sparhawk Not if you're excluding npc's { pMulti pi_multi = cMulti::getAt( pc->getPosition() ); if ( ! pi_multi ) pc->setMulti(NULL); else { pBoat pb = dynamic_cast<pBoat>(pi_multi); pHouse ph = dynamic_cast<pHouse>(pi_multi); if ( pb ) { //xan : probably the plr has entered the boat walking! //!\todo Change this when new owner-system is up and running NxwCharWrapper pets; pets.fillOwnedNpcs( pc, false, true ); for( pets.rewind(); !pets.isEmpty(); pets++ ) { pChar pc_b=pets.getChar(); if (! pc_b ) return; pc_b->MoveTo( boat->getPosition() + sLocation(1,1,2) ); pc_b->setMulti(boat); pc_b->teleport(); } } else if ( ph ) { if ( ph->isBanned(pc) ) { client->sysmesage("You are banned from that location."); sLocation newpos = pi_multi->getArea().br + sLocation(1, 1, pc->getPosition().z); pc->setPosition(newpos); pc->teleport(); return false; } // house refreshment code moved to dooruse() } } } // end of is player if ( z == illegal_z ) { pc->setPosition( sLocation(oldx, oldy) ); pClient client = pc->getClient(); if ( ! client ) { pc->blocked = 1; return false }