Поставь ему стандартную модель и посмотри, будет ли подвисать.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Похоже игра пыталась найти что нужно писать, но из-за отсутствия стринга для печати она зависала на эту секунду, которая могла стоить жизни игроку особенно в ДМ
Добавлено (11.05.2012, 22:50) --------------------------------------------- Слушай SLAwww, а как можно реализовать миникарту с отображением врагов на ней.. Я логически понимаю как, но програмно уже не хватает знаний понять чтобы это сделать .
Сообщение отредактировалseriously_petr - Пятница, 11.05.2012, 16:01
Для начала следует понять, как сделать простой радар. Нужно через определённые промежутки времени итерировать по всем объектам на уровне, находить среди них потомков CEnemyBase, определять, являются ли они активными, рассчитывать азимут и дальность, затем отрисовывать в HUD. Вот пример кода, для радара, который написал Фрагман:
Code
extern void DrawRadar( const CPlayer *penPlayerCurrent, CDrawPort *pdpCurrent) { // no player - no info, sorry if( penPlayerCurrent==NULL || (penPlayerCurrent->GetFlags()&ENF_DELETED)) return; if(!GetSP()->sp_bCooperative&&!GetSP()->sp_bSinglePlayer) return; if( !(((CModeController&)(*(penPlayerCurrent->m_penMainModeController))).GetHudAllowance()) ) return; if((penPlayerCurrent->m_bShowScore&&_bDrawStuff)||!penPlayerCurrent->m_bShowScore){
// find last values in case of predictor CPlayer *penLast = (CPlayer*)penPlayerCurrent; if( penPlayerCurrent->IsPredictor()) penLast = (CPlayer*)(((CPlayer*)penPlayerCurrent)->GetPredicted()); ASSERT( penLast!=NULL); if( penLast==NULL) return; // !!!! just in case
CEntityPointer penMode= _penPlayer->m_penMainModeController; CPlacement3D plPlayer=_penPlayer->GetPlacement(); plPlayer.pl_OrientationAngle(1)+=_penPlayer->en_plViewpoint.pl_OrientationAngle(1); FLOAT fRadarRadius = 100; if(penMode){ fRadarRadius=((CModeController&)*penMode).m_fRadarDistance; // the radius of the radar in meters (SEd units).. }
if(hud_bRadar||penMode&&((CModeController&)*penMode).m_eRadar!=R_NONE){ HUD_DrawIcon(pixRightBound-fOneUnit*2.7,pixTopBound+fOneUnit*3,_rRadar,C_WHITE|255,1,FALSE); _fCustomScaling = 0.3f; {FOREACHINDYNAMICCONTAINER(((CEntity&)*_penPlayer).GetWorld()->wo_cenEntities, CEntity, iten) { // For every entity in the level CEntity *pen = iten; if ((hud_bRadar&&!penMode||(penMode&&((CModeController&)*penMode).m_eRadar!=R_FRIENDLY))&&IsDerivedFromClass(pen, "Enemy Base")&&((CEnemyBase&)*pen).GetFlags()&ENF_ALIVE) { // if entity is an Enemy Base CEnemyBase *penEnemy = (CEnemyBase *)pen; // basicly we make a new enemy thing, Hey I may not know how to explain it, but atleast I know what it does.. hehe
if(penEnemy->m_bTemplate||penEnemy->m_penEnemy==NULL&&penEnemy->m_penPathMarker!=NULL){ continue; } CPlacement3D plEnemy; // we make a new placement thing plEnemy.pl_PositionVector=penEnemy->GetPlacement().pl_PositionVector; // get the position of this enemy ( plEnemy.pl_OrientationAngle=FLOAT3D(0,0,0); // set it to 0,0,0 for now. plEnemy.AbsoluteToRelativeSmooth(plPlayer); // get it's position relative to the position of the player. It's a bunch of maths...
FLOAT posX = pixRightBound-fOneUnit*2.9+plEnemy.pl_PositionVector(1)/4.1; // in my radar, the center of my radar is 128 pixels from the side FLOAT posY = pixTopBound+fOneUnit*4.1+plEnemy.pl_PositionVector(3)/3.4;// and 128 pixels from the bottom. Also, you can set the 2.5 to different amounts. A higher number means a wider range the radar will show. I'm not good at explaining maths, so you'll have to take it for granted.. sorry :). if(Abs(plEnemy.pl_PositionVector(2))<5){ HUD_DrawIcon(posX,posY,_rDot,C_RED|255,1,FALSE); }else if(plEnemy.pl_PositionVector(2)>0){ HUD_DrawIcon(posX,posY,_rDotUp,C_RED|255,1,FALSE); }else{ HUD_DrawIcon(posX,posY,_rDotDown,C_RED|255,1,FALSE); } }
if ((hud_bRadar&&!penMode||(penMode&&((CModeController&)*penMode).m_eRadar!=R_ENEMY))&&IsDerivedFromClass(pen, "Player")) { // if entity is an Enemy Base CPlayer *penPlayer = (CPlayer *)pen; // basicly we make a new enemy thing, Hey I may not know how to explain it, but atleast I know what it does.. hehe //only use active enemies who spotted someone
if(penPlayer==_penPlayer) { continue; }
CPlacement3D plPlayer1; // we make a new placement thing plPlayer1.pl_PositionVector=penPlayer->GetPlacement().pl_PositionVector; // get the position of this enemy ( plPlayer1.pl_OrientationAngle=FLOAT3D(0,0,0); // set it to 0,0,0 for now. plPlayer1.AbsoluteToRelativeSmooth(plPlayer); // get it's position relative to the position of the player. It's a bunch of maths...
if( plPlayer1.pl_PositionVector.Length() > fRadarRadius ) // if the Player is less than 24 meters away from the player { plPlayer1.pl_PositionVector(1)*=fRadarRadius/vPlayerFlat.Length(); plPlayer1.pl_PositionVector(3)*=fRadarRadius/vPlayerFlat.Length(); }
FLOAT posX = pixRightBound-fOneUnit*2.9+plPlayer1.pl_PositionVector(1)/4.1; // in my radar, the center of my radar is 128 pixels from the side FLOAT posY = pixTopBound+fOneUnit*4.1+plPlayer1.pl_PositionVector(3)/3.4;// and 128 pixels from the bottom. Also, you can set the 2.5 to different amounts. A higher number means a wider range the radar will show. I'm not good at explaining maths, so you'll have to take it for granted.. sorry :). if(Abs(plPlayer1.pl_PositionVector(2))<5){ HUD_DrawIcon(posX,posY,_rDot,C_GREEN|255,1,FALSE); }else if(plPlayer1.pl_PositionVector(2)>0){ HUD_DrawIcon(posX,posY,_rDotUp,C_GREEN|255,1,FALSE); }else{ HUD_DrawIcon(posX,posY,_rDotDown,C_GREEN|255,1,FALSE); } } if ((hud_bRadar&&!penMode||(penMode&&((CModeController&)*penMode).m_eRadar!=R_NONE))&&IsDerivedFromClass(pen, "Trigger2")) { // if entity is an Enemy Base CTrigger2 *penTrigger = (CTrigger2 *)pen; // basicly we make a new enemy thing, Hey I may not know how to explain it, but atleast I know what it does.. hehe //only use active enemies who spotted someone if (!penTrigger->m_bActive||!penTrigger->m_bRadar) { continue; } CPlacement3D plTrigger; // we make a new placement thing plTrigger.pl_PositionVector=penTrigger->GetPlacement().pl_PositionVector; // get the position of this enemy ( plTrigger.pl_OrientationAngle=FLOAT3D(0,0,0); // set it to 0,0,0 for now. plTrigger.AbsoluteToRelativeSmooth(plPlayer); // get it's position relative to the position of the player. It's a bunch of maths...
FLOAT TriggerOnHudX=plTrigger.pl_PositionVector(1); // X position of the Player (dot) relative to the player FLOAT TriggerOnHudY=plTrigger.pl_PositionVector(3);// Y position of the Player (dot) relative to the player
if( plTrigger.pl_PositionVector.Length() > fRadarRadius ) // if the Player is less than 24 meters away from the player { plTrigger.pl_PositionVector(1)*=fRadarRadius/vTriggerFlat.Length(); plTrigger.pl_PositionVector(3)*=fRadarRadius/vTriggerFlat.Length(); } FLOAT posX = pixRightBound-fOneUnit*2.9+plTrigger.pl_PositionVector(1)/4.1; // in my radar, the center of my radar is 128 pixels from the side FLOAT posY = pixTopBound+fOneUnit*4.1+plTrigger.pl_PositionVector(3)/3.4;// and 128 pixels from the bottom. Also, you can set the 2.5 to different amounts. A higher number means a wider range the radar will show. I'm not good at explaining maths, so you'll have to take it for granted.. sorry :). if(Abs(plTrigger.pl_PositionVector(2))<5){ HUD_DrawIcon(posX,posY,_rDot,penTrigger->m_colRadar,1,FALSE); }else if(plTrigger.pl_PositionVector(2)>0){ HUD_DrawIcon(posX,posY,_rDotUp,penTrigger->m_colRadar,1,FALSE); }else{ HUD_DrawIcon(posX,posY,_rDotDown,penTrigger->m_colRadar,1,FALSE); } } }}
Его радар, помимо прочего, умеет отображать на мини-карте триггеры с особым атрибутом, что позволяет делать "цели миссии". Разберёшься с этим - научу делать, собственно, мини-карту. =Р
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Кхм, кхм, простите что отвлекаю от радаров, но никто не подскажет как сделать так чтобы Зорги и Биомехи атаковали врагов а не игрока? Только подробно плиииз!
Psych, вроде уже обсуждалось, пожалуйста, используйте поиск по сайту. Надеюсь, Вы примете это во внимание и будете искать упоминания о предмете вопроса перед тем, как его задать.
Psych, дело в том, что это не так просто, как вы все тут думаете. Если мне не изменяет память, ответ на вопрос находится в Enemy Base и Watcher как минимум. Это нужно переписать функцию для поиска ближайшего врага, где вместо CPlayer указать CEnemyBase. Как-то так.
Добавлено (13.05.2012, 10:22) --------------------------------------------- Ё! Да там Player на каждой строчке. Нашел кучу всего интересно, типа
// if you have new player visible closer than current and in threat distance CEntity *penNewEnemy = GetWatcher()->CheckCloserPlayer(m_penEnemy, GetThreatDistance()); if (penNewEnemy!=NULL) { // switch to that player SetTargetHardForce(penNewEnemy); // start new behavior SendEvent(EReconsiderBehavior()); stop; }
// if you can see player if (IsVisible(m_penEnemy)) { // remember spotted position m_vPlayerSpotted = PlayerDestinationPos(); // if going to player spotted or temporary path position if (m_dtDestination==DT_PLAYERSPOTTED||m_dtDestination==DT_PATHTEMPORARY) { // switch to player current position m_dtDestination=DT_PLAYERCURRENT; }
// if you cannot see player } else { // if going to player's current position if (m_dtDestination==DT_PLAYERCURRENT) { // switch to position where player was last seen m_dtDestination=DT_PLAYERSPOTTED; } }
Сдесь два параллельных диалога. Конечно неудобно, но... Вопрос тот же как заставить биомехов и зоргов мочить других врагов а не игрока. Кто ПОДРОБНО расскажет - репа
CREATER, искать что-либо в теме на 50 страниц довольно тяжело. Проще будет ответить на вопрос ещё раз, чем искать ответ. =Р Однако, мне всё же лень объяснять всё по пунктам, я просто дам свои исходники. =Р Они писались на основе ХВОХ-мода, так что придётся удалить все упоминания ModeController и класса Settings, иначе при компиляции вылезут ошибки. В CEnemyBase добавлены новые поля, например Built-it tactics, Use attack group и Attack group. Последнее поле определяет т.н. "группу" врага, то есть, все враги из группы 1 будут атаковать всех врагов из всех остальных групп (2, 3, 4 и т. д.), а также игрока. Враги из группы 0 будут атаковать ТОЛЬКО врагов из других групп, но не будут атаковать игрока. Когда эта фича включена (и когда включён built-in tactics) игра может начать тормозить, поэтому такое поведение можно выключить для врагов, которым оно не требуется. Враги, у которых такое поведение включено, всё равно будут атаковать тех, у кого оно выключено, если их группа отличается. Также у врагов есть параметр Coward.. Ну, это я прикалывался. )
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Настройки дальности и типа радара указываются из ентити Mode Controller которую я уже добавил и добавил поля. У радара есть четыре типа отображения: None, Both, Friendly only и Enemy only Дальность радара отображается в СЕД метрах
Mode Controller схож по функциям на Music Holder, прописывается в Player также и должен обязательно присутсвовать на карте
У Trigger2 два поля m_bRadar и m_colRadar первая это отображение точкт, 2 цвет точки
В HUD вычисляется сначала хозяин радара, ищется ModeC. из ModeC. находится его тип для решения как дальше отображать объекты на радаре. Находятся позиция игрока и его ориентация. Находятся позиции врагов/триггеров с атрибутом относительно игрока в радиусе радара. Объекты отображаются точками определённого цвета. В конце идёт отображение на ХУДе.
Добавлено (13.05.2012, 17:03) --------------------------------------------- Плюс почему у меня ошибка в этой строке if( !(((CModeController&)(*(penPlayerCurrent->m_penMainModeController))).GetHudAllowance()) ) return;
'CModeController' : undeclared identifier
Ведь ентитя существует в ДЛЛ.
C Trigger2 такаяже проблема
Сообщение отредактировалseriously_petr - Воскресенье, 13.05.2012, 17:05
seriously_petr, а #include "EntitiesMP\ModeController.h" вписал в начало HUD.cpp?
Where did all the dragons go? We searched in the hills and we searched down the canyons, we even scanned the depths of the caves with our armour, swords and lanterns. Oh, if only had we seen him lurch, from his glorious skull covered perch.
CRACK went his claws and SMACK swipped the tail, a ROAR of might, one big BITE.
Seriously_P Кароче Петя и Слава я совершенно не умею работать с dll библеотеками но мне очень надо сделать вышеупомянутое. И я думаю как это провернуть.
Добавлено (13.05.2012, 18:42) --------------------------------------------- А ведь говорил мне Костян: Зачем тебе эти скрипты лучше dll изучай! Как в воду глядел...
Петр кто сказал что я брошу? Угадай что я смотрел прошлой ночью на ютюбе? Вощем кое-что прояснилось 1.Нужно скачать программу открывающую dll 2.Собственно, удачно открыть dll 3.Сделать резервную копию dll 4.Поставить в исходнике SLawww'а у зоргов и биомехов группу 0 5.Убрать все упоминания modecontroller и settings 6.Кинуть изменненный исходник в EntitiesMP.dll 7.Тестануть 8.Все
Psych, декомпилировать длл нельзя и в этом вся суть.
До сих пор в топе загрузок и просмотров... Неужели я тоже оставил свой след на этом сайте? А ведь я здесь уже целых двенадцать лет... Удалил свои старые карты из профиля, на кой они мне. Маппер из меня никудышный.