Новые сообщения Участники Правила Поиск
Помощь по SDK для Serious Sam 1.05/1.07
ST27 Понедельник, 27.02.2017, 14:49 | Сообщение # 2641


Сообщений: 460
Награды: 7
Замечания: 0%
 
Jack_Stone, ищешь функцию CalcWeaponPosition в PlayerWeapons, копируешь ее и называешь как-нибудь типа CalcWeaponPositionFixed и далее в ней под строкой // weapon handle заменяешь
Код
if (!m_bMirrorFire) {
  plPos.pl_PositionVector = FLOAT3D( wpn_fX[m_iCurrentWeapon], wpn_fY[m_iCurrentWeapon],
                    wpn_fZ[m_iCurrentWeapon]);
  if (m_bSniping) {
    plPos.pl_PositionVector = FLOAT3D( 0.0f, 0.0f, 0.0f );
  }
} else {
  plPos.pl_PositionVector = FLOAT3D( -wpn_fX[m_iCurrentWeapon], wpn_fY[m_iCurrentWeapon],
                    wpn_fZ[m_iCurrentWeapon]);
}

на следующее:
Код
plPos.pl_PositionVector = FLOAT3D( 0.0f, 0.0f, 0.0f );

А потом заменяешь CalcWeaponPosition на CalcWeaponPositionFixed в функциях UpdateTargetingInfo и PrepareBullet


- My Personal Site -
Jack_Stone Понедельник, 06.03.2017, 07:30 | Сообщение # 2642


Сообщений: 146
Награды: 1
Замечания: 0%
 
STPROD, большое спасибо :)

Добавлено (06.03.2017, 07:27)
---------------------------------------------
Хочу прописать переменную для Nukeballs, но не выходит. Подскажите, пожалуйста, чего не хватает.

Код
--------------------Configuration: EntitiesMP - Win32 Release--------------------
EntitiesMP/PlayerWeapons.es
Compiling...
HUD.cpp
PlayerWeapons.cpp
D:/Images/For_games/SeriousSam/Sam/NE/Sources/EntitiesMP/PlayerWeapons.es(642) : error C2065: 'MAX_NUKEBALLS' : undeclared identifier
D:/Images/For_games/SeriousSam/Sam/NE/Sources/EntitiesMP/PlayerWeapons.es(2810) : error C2065: 'AMMO_NUKEBALLS' : undeclared identifier
D:/Images/For_games/SeriousSam/Sam/NE/Sources/EntitiesMP/PlayerWeapons.es(3296) : error C2065: 'AV_NUKEBALLS' : undeclared identifier
Generating Code...
Error executing cl.exe.

GameMP.dll - 3 error(s), 0 warning(s)

Добавлено (06.03.2017, 07:30)
---------------------------------------------
MAX_NUKEBALLS объявлял, и всё равно как не объявленное пишет:

Код
65 INDEX m_iMaxNukeBalls   = MAX_NUKEBALLS,


AMMO_NUKEBALLS и AV_NUKEBALLS понятия не имею, где объявлять.


ST27 Понедельник, 06.03.2017, 08:35 | Сообщение # 2643


Сообщений: 460
Награды: 7
Замечания: 0%
 
А поиск по всем файлам не помогает, нет? Вот эта вот кнопка

А так, файл Common.h


Прикрепления: 0302447.png (12.0 Kb) · 4106552.png (16.3 Kb) · 7522841.png (9.1 Kb)


- My Personal Site -
Jack_Stone Понедельник, 06.03.2017, 09:14 | Сообщение # 2644


Сообщений: 146
Награды: 1
Замечания: 0%
 
STPROD, спасибо :)

Jack_Stone Понедельник, 13.03.2017, 18:59 | Сообщение # 2645


Сообщений: 146
Награды: 1
Замечания: 0%
 
Помогите, пожалуйста с кодом. Я хочу сделать так, что биомех при ходьбе мог ранить других монстов и Сэма (как бык или бензопильщик при беге), прописал по аналогии, объявил все нужные переменные, но все равно не работает. Что может быть не так?

Код
/************************************************************
*                   ATTACK SPECIFIC                        *
************************************************************/
  void IncreaseKickedMass(CEntity *pen) {
    EntityInfo *peiTarget = (EntityInfo*) (pen->GetEntityInfo());
    if (peiTarget!=NULL) {
      m_fMassKicked += peiTarget->fMass;
    }
  };

/************************************************************
*                      ATTACK FUNCTIONS                    *
************************************************************/
  // touched another live entity
  void LiveEntityTouched(ETouch etouch) {
    if (m_penLastTouched!=etouch.penOther || _pTimer->CurrentTick()>=m_fLastTouchedTime+0.25f) {
      // hit angle
      FLOAT3D vDirection = en_vCurrentTranslationAbsolute;
      vDirection.Normalize();
      ANGLE aHitAngle = FLOAT3D(etouch.plCollision)%vDirection;
      // only hit target in front of you
      if (aHitAngle < 0.0f) {
        // increase mass - only if not another bull
        if (!IsOfSameClass(this, etouch.penOther)) {
          IncreaseKickedMass(etouch.penOther);
        }

        // store last touched
        m_penLastTouched = etouch.penOther;
        m_fLastTouchedTime = _pTimer->CurrentTick();
        // damage
        FLOAT3D vDirection = m_penEnemy->GetPlacement().pl_PositionVector-GetPlacement().pl_PositionVector;
        vDirection.Normalize();
        InflictDirectDamage(etouch.penOther, this, DMT_CLOSERANGE, -aHitAngle*40.0f,
          FLOAT3D(0, 0, 0), vDirection);
        // kick touched entity
        FLOAT3D vSpeed = -FLOAT3D(etouch.plCollision);
        vSpeed = vSpeed*10.0f;
        const FLOATmatrix3D &m = GetRotationMatrix();
        FLOAT3D vSpeedRel = vSpeed*!m;
        if (vSpeedRel(1)<-0.1f) {
          vSpeedRel(1)-=5.0f;
        } else {
          vSpeedRel(1)+=5.0f;
        }
        vSpeedRel(2)=5.0f;

        vSpeed = vSpeedRel*m;
        KickEntity(etouch.penOther, vSpeed);
      }
    }
  };

  // touched entity with higher mass
  BOOL HigherMass(void) {
    return (m_fMassKicked > 500.0f);
  };
Сообщение отредактировал Jack_Stone - Понедельник, 13.03.2017, 19:51


Heming_Hitrowski Понедельник, 13.03.2017, 22:56 | Сообщение # 2646


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Сложно сказать с первого взгляда. Попробуй проставить CPrintF'ы где-нибудь в месте, где должен наноситься урон. Если в консоли не будет сообщения, то в самом начале процедуры и так далее. Проверь, соблюдаются ли все условия.
Сообщение отредактировал Heming_Hitrowski - Понедельник, 13.03.2017, 23:00


Jack_Stone Вторник, 14.03.2017, 17:55 | Сообщение # 2647


Сообщений: 146
Награды: 1
Замечания: 0%
 
А чем CPrintF может помочь? это же текст.

SLAwww Вторник, 14.03.2017, 18:05 | Сообщение # 2648


Рряа? ^..^
Сообщений: 2398
Награды: 27
Замечания: 0%
 
Поменяй родительский класс биомеханоида на CEnemyRunInto, иначе LiveEntityTouched не будет вызван.

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.

and so ended our search.
Jack_Stone Вторник, 14.03.2017, 18:13 | Сообщение # 2649


Сообщений: 146
Награды: 1
Замечания: 0%
 
Сделал, но все равно урона не происходит :(

Jack_Stone Понедельник, 20.03.2017, 18:40 | Сообщение # 2650


Сообщений: 146
Награды: 1
Замечания: 0%
 
Подскажите, пожалуйста, как прописать изменение переменной в единицу времени после включения функции. Есть ли какая-нибудь общая формула?

SLAwww Вторник, 21.03.2017, 23:44 | Сообщение # 2651


Рряа? ^..^
Сообщений: 2398
Награды: 27
Замечания: 0%
 
Ждать можно только в процедурах. Возможно несколько вариантов, в зависимости от ситуации. Если от игрового объекта ничего не требуется делать в течении этой секунды, можно использовать autowait. Если в это время могут обрабатываться другие события, то нужно написать wait с заданным временем ожидания:
Код
wait(1.0f) {
  on (EBegin) : { resume; }
  // тут обрабатываешь остальные события
  on (ETimer) : {
    // тут меняешь свою переменную
    stop;
  }
}

А если в период ожидания объект может перейти в другое состояние (процедуру), нужно использовать CReminder (поищи функцию SpawnReminder). Он через заданное время пришлёт ивент EReminder.


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.

and so ended our search.
Jack_Stone Вторник, 21.03.2017, 23:47 | Сообщение # 2652


Сообщений: 146
Награды: 1
Замечания: 0%
 
Предыдущий вопрос был некорректный.

Вот по-точнее.

Код
void Flashlight(){
      if (m_iBatCount>0) {
       for(INDEX i=m_iBatCount-1; i<m_iBatCount; i++)
   {
      m_iBatCount--;
   }

     }
   }


Я прописал фонарю батарейки и теперь хочу сделать так, чтобы они кончались (1 единица в секунду). m_iBatCount - батарейка.

Вопрос: Как сделать, чтобы этот цикл повторялся каждую секунду?

Если б хотя бы autowait работал в void, то осталось бы только понять, как запустить функцию заново.

Функция прописана в Player.es
Сообщение отредактировал Jack_Stone - Вторник, 21.03.2017, 23:49


Jack_Stone Среда, 22.03.2017, 00:38 | Сообщение # 2653


Сообщений: 146
Награды: 1
Замечания: 0%
 
SLAwww, а где это нужно прописать?

Цитата SLAwww ()
wait(1.0f) {
on (EBegin) : { resume; }
// тут обрабатываешь остальные события
on (ETimer) : {
// тут меняешь свою переменную
stop;
}
}


SpawnReminder я нашел, но никак не пойму как он работает.

В конечном итоге функция уменьшения батарейки фонаря идет в PlayerWeapons (не знаю глупо это или нет, но это пока единственный рабочий способ, и то наполовину), и если прописывать ее как Event наряду со стрельбой и тд, то она, понятное дело, заглушает и стрельбу и всё остальное, пока фонарь включен.

Есть ли еще способ сделать уменьшение переменной не в PlayerWeapons, а в Player?
Например, если менять что то стандартное - можно ли сделать так, чтобы Супер Бомба после нажатия на клавишу тратилась не один раз, а пока не нажмешь на клавишу снова? То же самое с фонарем - вкл/выкл, другими словами.
Я спрашиваю это, потому что прописал батарейку по аналогии с Бомбой.
Сообщение отредактировал Jack_Stone - Среда, 22.03.2017, 00:50


SLAwww Среда, 22.03.2017, 17:25 | Сообщение # 2654


Рряа? ^..^
Сообщений: 2398
Награды: 27
Замечания: 0%
 
Цитата Jack_Stone ()
Если б хотя бы autowait работал в void

Налицо явное непонимание разницы между functions и procedures. Советую прочитать мою статью в последнем выпуске Serious Time ( http://www.serioussite.ru/load/raznoe/serious_time_1_5/10-1-0-2283 ), там я долго и подробно всё это объясняю. Уменьшать переменную раз в секунду ты можешь из любой процедуры.


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.

and so ended our search.
Jack_Stone Среда, 22.03.2017, 21:47 | Сообщение # 2655


Сообщений: 146
Награды: 1
Замечания: 0%
 
SLAwww, я в программировании ноль, потому наверное и вопросы глупые. Так что спасибо за помощь, обязательно прочту :) :) Что касается моего вопроса про фонарь, то я сделал что хотел, правда каким-то идиотским и совершенно случайным способом, но зато нужный результат получил. :)

Jack_Stone Воскресенье, 26.03.2017, 21:43 | Сообщение # 2656


Сообщений: 146
Награды: 1
Замечания: 0%
 
Народ, скажите плиз, а можно поставить звуки от ударов ножа по поверхности? Я посмотрел что там с Bullet, много всего. С ножом, я так понял, то же самое? Или как то проще можно? Например сделать отсылку на Bullet. O_o
Сообщение отредактировал Jack_Stone - Воскресенье, 26.03.2017, 21:44


Heming_Hitrowski Воскресенье, 26.03.2017, 23:02 | Сообщение # 2657


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Jack_Stone, это можно сделать в PlayerWeapons, в функции CutWithKnife

Jack_Stone Понедельник, 27.03.2017, 15:49 | Сообщение # 2658


Сообщений: 146
Награды: 1
Замечания: 0%
 
Heming_Hitrowski, пожалуйста, немного по-подробнее. Я не могу никак понять, как нужно это оформить.

Heming_Hitrowski Понедельник, 27.03.2017, 22:02 | Сообщение # 2659


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Думаю тебе прежде всего стоит разобраться, как работает луч. (мне тут придется много расписывать, и возможно не самым точным образом, поэтому я этого делать не буду. Но ты обязательно поэкспериментируй с CastRay) Подскажу:

Там есть условие, когда то, на что ударил луч, является брашем:

Код
if(crRay.cr_penHit->GetRenderType()==RT_BRUSH)


или моделью

Код
else if(crRay.cr_penHit->GetRenderType()==RT_MODEL)


Вот туда и напиши звуки.
Только если надо чисто от ножа, само собой, надо будет добавить дополнительное условие:

if (m_iCurrentWeapon == WEAPON_KNIFE) {
//...
}


Пардон. Для бензопилы есть похожая функция - CutWithChainsaw.
Сообщение отредактировал Heming_Hitrowski - Понедельник, 27.03.2017, 22:12


Jack_Stone Понедельник, 27.03.2017, 23:34 | Сообщение # 2660


Сообщений: 146
Награды: 1
Замечания: 0%
 
Попробовал сделать по аналогии с Bullet, вот что выдает. Как тут нужно звук инициализировать?

warning C4700: local variable 'bSound' used without having been initialized

А прописал вот это:

SpawnHitTypeEffect(this, bhtType, bSound, vHitNormal, crRay.cr_vHit, vHitDirection, FLOAT3D(0.0f, 0.0f, 0.0f));


Код
          if(crRay.cr_penHit->GetRenderType()==RT_BRUSH)
          {
            INDEX iSurfaceType=crRay.cr_pbpoBrushPolygon->bpo_bppProperties.bpp_ubSurfaceType;
            EffectParticlesType eptType=GetParticleEffectTypeForSurface(iSurfaceType);
          
            FLOAT3D vNormal=crRay.cr_pbpoBrushPolygon->bpo_pbplPlane->bpl_plAbsolute;
            FLOAT3D vReflected = vDir-vNormal*(2.0f*(vNormal%vDir));
            ((CPlayer&)*m_penPlayer).AddBulletSpray( vBase+vFront, eptType, vReflected);
          SpawnHitTypeEffect(this, bhtType, bSound, vHitNormal, crRay.cr_vHit, vHitDirection, FLOAT3D(0.0f, 0.0f, 0.0f));
    
          }


Все переменные в скобках объявил, только с bSound проблема.
Сообщение отредактировал Jack_Stone - Понедельник, 27.03.2017, 23:36


Heming_Hitrowski Вторник, 28.03.2017, 14:12 | Сообщение # 2661


Double Jumper
Сообщений: 887
Награды: 32
Замечания: 0%
 
Да ты что! Тебе же надо просто звук добавить! Посмотри как, например, в процедуре SwingKnife проигрывается звук взмаха. Про Bullet вообще забудь)
Сообщение отредактировал Heming_Hitrowski - Вторник, 28.03.2017, 14:13


Jack_Stone Среда, 29.03.2017, 19:29 | Сообщение # 2662


Сообщений: 146
Награды: 1
Замечания: 0%
 
Heming_Hitrowski, я так и сделал :) просто я изначально хотел, чтобы при ударе по каждой поверхности проигрывался разный звук. А так то да)) Ничего тут сложного нет, прописал собственно как и все остальные звуки :D

Jack_Stone Четверг, 13.04.2017, 18:12 | Сообщение # 2663


Сообщений: 146
Награды: 1
Замечания: 0%
 
Народ, подскажите, пожалуйста, следующее. В одном условии мне нужно прописать наличие оружия, неважно есть к нему патроны или нет, важно то, что его уже подбирали. Если точнее, то я про функцию AddDefaultAmmoForWeapon. У меня для каждого оружия по 2 переменных патронов - магазин и патроны в запасе, так вот я хочу сделать так, чтобы при ПЕРВОМ подборе AmmoPicked равнялось 0, а при последующих подборах оружия AmmoPicked равнялось количеству патронов в магазине, потому и логично каким-то образом прописать наличие оружия у Сэма. Может кто-нибудь с этим сталкивался уже? :)

Jack_Stone Пятница, 05.05.2017, 09:12 | Сообщение # 2664


Сообщений: 146
Награды: 1
Замечания: 0%
 
Подскажите пожалуйста как сделать так, чтобы функция активировалась, когда Сэм находится внутри определенной области, как ,например, с SoundHolder - звук слышен, только если находишься в пределах FalloffRange. Возможно ли это сделать, не создавая отдельный класс-объект, а используя уже что-то готовое, хоть тот же SoundHolder, но чтобы при попадании в область FalloffRange, срабатывало что-то из другого класса - менялась какая-нибудь переменная. Это возможно?

Если попроще, то так -

Надо, чтобы во время нахождения на зоне FalloffRange какого-нибудь объекта, в Player.es какая-то переменная принимала значение TRUE, а при выходе из этой зоны становилась обратно FALSE.
Сообщение отредактировал Jack_Stone - Пятница, 05.05.2017, 12:43


Ar2R-devil-PiNKy Пятница, 05.05.2017, 14:28 | Сообщение # 2665


Creative virtuoso
Сообщений: 3740
Награды: 58
Замечания: 
 
Посмотри в энтитии WatchPlayer, там есть отдельное триггирование при нахождении внутри и вне его зоны

Мои работы
Jack_Stone Пятница, 05.05.2017, 16:17 | Сообщение # 2666


Сообщений: 146
Награды: 1
Замечания: 0%
 
Ar2R-devil-PiNKy, спасибо за подсказку, WatchPlayers вроде как подходит. Но проблема с объявлением переменной:

пишу вот это в том месте, где это должно срабатывать (m_bBuyActive - та самая переменная которая должна меняться) -
Код
((CPlayer*)&*m_penPlayer)->m_bBuyActive = TRUE;


и получаю вот это -

Код
error C2059: syntax error : ')'


Что я не так сделал?


Ar2R-devil-PiNKy Пятница, 05.05.2017, 17:09 | Сообщение # 2667


Creative virtuoso
Сообщений: 3740
Награды: 58
Замечания: 
 
Где-то скобку не открыл %)

Мои работы
Jack_Stone Пятница, 05.05.2017, 17:18 | Сообщение # 2668


Сообщений: 146
Награды: 1
Замечания: 0%
 
Ar2R-devil-PiNKy, так открыто всё :) а если добавляю еще пишет PARSE ERROR. Вот что за фигня.
Может объявлять надо как-то по-особому и делать отсылку на Player?
Сообщение отредактировал Jack_Stone - Пятница, 05.05.2017, 17:24


shadow_tin Суббота, 06.05.2017, 06:44 | Сообщение # 2669


Сообщений: 164
Награды: 6
Замечания: 0%
 
Jack_Stone, ошибка такого рода может быть вызвана любой лишней или недостающей скобкой, отсутствием точки с запятой и т.п. Нужно проверять не только строку, на которую указывает компилятор, но и весь блок/файл выше.


"Просто у него окрепшая физика, а ты ещё не дорос..."
Jack_Stone Суббота, 06.05.2017, 11:35 | Сообщение # 2670


Сообщений: 146
Награды: 1
Замечания: 0%
 
Проверю, но как то странно, почему должно быть что то лишнее или недостающее.

Вот другой вопрос:

В WatchPlayers я прописал доп. переменную (m_bBuy)

Код
    // send range event
    if (m_bRangeWatcher && m_penOwner==NULL) {
//     SendInRange(this, m_eetEventClose, FLOATaabbox3D(GetPlacement().pl_PositionVector, m_fDistance));

      m_bBuy = TRUE;

    // send to owner
    } else {
      SendToTarget(m_penOwner, m_eetEventClose, m_penCurrentWatch);
    }
  };


Так вот как сделать, чтобы изменении этой переменной вызывало изменение другой переменной в Player?
В Player я прописал это:

Код
BOOL m_bBuyActive2 = ((CWatchPlayers&)*m_penOwner).m_bBuy;


То есть при попадании в область WatchPlayers m_bBuy становится TRUE, а значит и m_bBuyActive2 тоже должна становиться TRUE. Логически вроде бы правильно написано, но не работает, а виснет.

В общем вопрос - как сделать, чтобы изменение значения переменной в WatchPlayers меняло значение переменной в Player ?

Или правильнее делать отсылку сразу из WatchPlayers на Player ?
Цитата Jack_Stone ()
((CPlayer*)&*m_penPlayer)->m_bBuyActive2 = TRUE;
Сообщение отредактировал Jack_Stone - Суббота, 06.05.2017, 11:36


Поиск: