Comments (14)
В общем-то, изначально я использовал:
forward FCNPC_OnStreamIn(npcid, forplayerid);
forward FCNPC_OnStreamOut(npcid, forplayerid);
Я так понял, OnStreamIn - в поле зрения npc попал playerid, OnStreamOut - playerid вышел из поле зрения npc, так? Но с этим вариантом возникли некие проблемы, поэтому пришлось отложить его и взять другой, с паблика.
Без массивов, таймеров.
from fcnpc.
Ты даёшь боту команду - идти в координаты игрока, естественно будут проблемы с углом, так как бот считает, что находится точно там, где находится игрок, а игрок этого не видит, ибо работают коллизии между моделями. Поэтому нужно направлять бота не в точку игрока, а немного до него.
Вот как-то так можно устанавливать правильную позицию:
stock FCNPC_ComeToPlayer(npcid, playerid, Float:dist_offset = 0.5)
{
new
Float:npc_x, Float:npc_y, Float:npc_z,
Float:npc_angle,
Float:player_x, Float:player_y, Float:player_z,
Float:distance,
Float:result_x, Float:result_y;
FCNPC_GetPosition(npcid, npc_x, npc_y, npc_z);
npc_angle = FCNPC_GetAngle(npcid);
GetPlayerPos(playerid, player_x, player_y, player_z);
distance = VectorSize(npc_x - player_x, npc_y - player_y, npc_z - player_z);
GetCoordsInFront(npc_x, npc_y, npc_angle, distance - dist_offset, result_x, result_y);
FCNPC_GoTo(npcid, result_x, result_y, player_z);
}
Функция GetCoordsInFront есть в bg.pwn, но продублирую здесь:
stock GetCoordsInFront(Float:x, Float:y, Float:a, Float:distance, &Float:res_x, &Float:res_y)
{
res_x = x + (distance * floatsin(-a, degrees));
res_y = y + (distance * floatcos(-a, degrees));
}
В целом код очень плох, нет желания в нём копаться, но вот несколько рекомендаций, что я могу дать после беглого осмотра:
- Рекомендую использовать
FCNPC_SetAngleToPlayer(npcid, playerid)
, заместо самописнойFCNPC_Player_Angle(npcid, playerid)
. - Ещё
FCNPC_OnReachDestination
- это автовызываемая функция плагина, не стоит вызывать её с помощьюCallLocalFunction
.
from fcnpc.
В общем, доделал свой вариант, немного проблемы с OnStreamIn и OnStreamOut, преследуют игрока до бесконечности, есть ли вариант исправить или необходимо что-то создавать, к примеру IsPlayerInRangeOfPoint?
from fcnpc.
В FCNPC_OnStreamIn
нужно поставить проверку на запущенность таймера и не запускать ещё один, если он уже работает. А в FCNPC_OnStreamOut
нужно убивать его (KillTimer
) если он запущен.
from fcnpc.
Возник ещё вопрос :) При нанесении урона боту он должен менять цель на атакующего, но не работает через FCNPC_OnTakeDamage, срабатывает при цикле, но тогда цель меняют все боты, а должны только те, кого атаковали. Так же при нанесении урона ботом, урон не отнимается, что делаю не так?
P.S. Возможно ли отобразить уровень здоровья над голой бота? А также, возможно ли сменить их цвет на радаре?
from fcnpc.
При нанесении урона боту он должен менять цель на атакующего, но не работает через FCNPC_OnTakeDamage, срабатывает при цикле, но тогда цель меняют все боты, а должны только те, кого атаковали.
Сперва нужно поднять знания в программировании:
public FCNPC_OnTakeDamage(npcid, damagerid, weaponid, bodypart, Float:health_loss)
{
new npc_index = Zombies_GetArrayIndex(npcid);
if (npc_index != INVALID_PLAYER_ID && ZombiesInfo[npc_index][IsATarget] == 1) {
KillTimer(ZombiesInfo[npc_index][Target]);
ZombiesInfo[npc_index][Target] = SetTimerEx("ZombieOnStreamIn", 1000, true, "ii", ZombiesInfo[npc_index][Connect], damagerid);
FCNPC_SetAngleToPlayer(ZombiesInfo[npc_index][Connect], damagerid);
FCNPC_ComeToPlayer(ZombiesInfo[npc_index][Connect], damagerid);
}
return true;
}
stock Zombies_GetArrayIndex(npcid)
{
for (new i = 0; i < sizeof(ZombiesInfo); i++) {
if (npcid == ZombiesInfo[i][Connect]) {
return i;
}
}
return INVALID_PLAYER_ID;
}
Так же при нанесении урона ботом, урон не отнимается, что делаю не так?
Не читаешь инструкцию.
Нужно объявить эти public функции хотя бы в одном из запущенных скриптов:
- OnPlayerGiveDamage
- OnPlayerTakeDamage
- OnPlayerWeaponShot
- OnPlayerStreamIn
- OnPlayerStreamOut
P.S. Возможно ли отобразить уровень здоровья над голой бота?
Стандартные - нет, можно отобразить с помощью 3D текстов или объектов.
А также, возможно ли сменить их цвет на радаре?
Да, также как для обычных игроков.
from fcnpc.
Немного не понял)
Нужно объявить эти public функции хотя бы в одном из запущенных скриптов:
OnPlayerGiveDamage
OnPlayerTakeDamage
OnPlayerWeaponShot
OnPlayerStreamIn
OnPlayerStreamOut
Так чтоль?
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
{
FCNPC_OnGiveDamage(npcid, issuerid, weaponid, bodypart, Float:health_loss);
return true;
}
from fcnpc.
Так чтоль?
Нет, так:
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
{
return 1;
}
Но в OnPlayerGiveDamage
и в OnPlayerTakeDamage
лучше возвращать 0, чтобы выполнение не прерывалось на этом скрипте.
from fcnpc.
Хм.. объявил функцию, но почему-то не работает...
public OnPlayerGiveDamage(playerid, damagedid, Float:amount, weaponid, bodypart)
{
return false;
}
public FCNPC_OnGiveDamage(npcid, issuerid, weaponid, bodypart, Float:health_loss)
{
new Float: PlayerHP;
GetPlayerHealth(issuerid, PlayerHP);
SetPlayerHealth(issuerid, PlayerHP-10.0);
return true;
}
Извиняй за надоедливость ;)
from fcnpc.
Нужно объявить все.
from fcnpc.
Объявил все вышеперечисленные функции, однако не работает, отнимает от 5-7 хп, вместо заплонированного 10.
from fcnpc.
Ты чем читаешь вообще? Где я писал, что OnPlayerWeaponShot
должен возвращать false?
И посмотри чему равны npcid
, issuerid
- возможно я их местами перепутал.
from fcnpc.
Дак OnPlayerWeaponShot - true. Скорей перепутал.
new Float: PHP;
GetPlayerHealth(npcid, PHP);
SetPlayerHealth(npcid, PHP-10.0);
Так заработало.
from fcnpc.
Да, уже поправил. В следующем обновлении будет.
from fcnpc.
Related Issues (20)
- Need Some Information About Some Natives HOT 3
- Correct Delta Calculations
- Signal 11 (Segmentation fault), address is 351 from f79570e3 HOT 2
- Signal 11 (Segmentation fault) HOT 2
- FCNPCs can't drive trailers
- The position of the train cars is not returned if FCNPC drive train.
- FCNPC_EnterVehicle. NPC should not check map.
- FCNPC_LoadPlayingPlayback conflicts with temporary recordings loaded by FCNPC_StartPlayingPlayback
- FCNPC Not created HOT 1
- FCNPC CRASH HOT 7
- FCNPC CRASH AFTER GMX HOT 9
- FCNPC Crash HOT 4
- Crash issue HOT 3
- DL FCNPC_SetVelocity HOT 11
- Bug HOT 3
- Crash while server executing HOT 14
- NPC leaves the server directly after spawning. HOT 3
- Server is not starting HOT 11
- Server crashes randomly (FCNPC 2.0.9, SA:MP 0.3.7 R2, Ubuntu 22.04). HOT 1
- Callbacks not being called on filterscripts HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from fcnpc.