Вопросы про оружие.

68
0
Здравствуйте, хотел у вас спросить несколько вопросов:
1.Как сделать чтобы мобы понимали кто в них стреляет.
2.Как сделать плавную анимацию поворота(например прицеливания) пытался указывать только конечную точку, но автомат резко переходит в конечную точку и все.

Заранее спасибо за ответ.
[merge_posts_bbcode]Добавлено: 30.03.2015 10:45:41[/merge_posts_bbcode]

Ах да забыл еще об 1 вопросе: Как отключить перекрестие? Если у тебя в руках оружие.
 
1 - учи яву. Передавай ентити игрока, который стреляет. Наноси урон методом attackEntityFrom (1.7.10), там есть аргумент атаккера, пиши метод cousePlayer что-то в этом роде, внутри ентити, и количество урона
2 - прибавлять каждый тик определённое значение, пока не станет нужным.
3 - евент какой-то, позже напишу.
[merge_posts_bbcode]Добавлено: 30.03.2015 09:25:37[/merge_posts_bbcode]

1 так-же, в стреле, уже есть такое, осталось просто при вызове класса указать игрока и поставить гравитацию на 0. Всё это спавнить от сервера, и получится нубо-пуля, но вполне нормальная.
 
svk написал(а):
1 - учи яву. Передавай ентити игрока, который стреляет. Наноси урон методом attackEntityFrom (1.7.10), там есть аргумент атаккера, пиши метод cousePlayer что-то в этом роде, внутри ентити, и количество урона
2 - прибавлять каждый тик определённое значение, пока не станет нужным.
3 - евент какой-то, позже напишу.
[merge_posts_bbcode]Добавлено: 30.03.2015 09:25:37[/merge_posts_bbcode]

1 так-же, в стреле, уже есть такое, осталось просто при вызове класса указать игрока и поставить гравитацию на 0. Всё это спавнить от сервера, и получится нубо-пуля, но вполне нормальная.
1. Java я и так не плохо знаю. Я энити и так предаю игрока(но не использую как надо), пулю спавню и так от сервера. Сейчас гляну как наносит урон стрела. Точно блин а я и не подумал что пуля это нечто схожее со стрелой.
 
1) Разберешься на примере той же стрелы.


2) Нужно интерполировать между начальным и конечным положением. Допустим, начальное положение ты задаешь так:
Код:
GL11.glTranslatef(0.0F, 0.0F, 1.0F);
GL11.glRotatef(45.0F, 0.0F, 0.0F);
А конечное - так:
Код:
GL11.glTranslatef(0.0F, 0.0F, 2.0F);
GL11.glRotatef(90.0F, 0.0F, 0.0F);
Заводишь где-нибудь int переменную aimProgress, отвечающую за процесс прицеливания. Допустим, максимальное значение пусть будет 5 (за 5 тиков полностью прицеливаешься). Каждый тик с зажатой ПКМ aimProgress увеличивается на 1, пока не достигнет 5. Каждый тик без зажатой ПКМ уменьшается на 1, пока не достигнет 0. Запиши максимальное значение куда-нибудь как константу, например, MAX_AIMING_TIMER.

Теперь это нужно плавно анимировать. Во-первых, у тебя не 20 ФПС, а больше, и возможных положений тоже больше пяти. Так что пишешь в коде рендера как-то так:
Код:
//Minecraft.timer - приватное поле, но все приватные поля становятся публичными при запуске игры из-за форджа, и единственная проблема - скомпилировать. Если пишешь под старые версии и можешь менять сорцы майна, то просто сделай timer публичным, иначе вытаскивай через рефлексию или еще каким-нибудь костылем.
float partialTicks = Minecraft.getMinecraft().timer.renderPartialTicks;
float progress = твоя_интовая_переменная_с_прогрессом_прицеливания;
//проверка, зажата ли ПКМ (уменьшается или увеличивается прогресс прицеливания в данный момент). Это - самый банальный способ проверки, есть более удачные. Проверяй так же, как когда увеличиваешь/уменьшаешь прогресс прицеливания. Как другой вариант, можно просто записывать, что произошло последний раз при изменении прогресса прицеливания: увеличение или уменьшение.
if (Mouse.isKeyDown(1)){
    progress += partialTicks;
} else {
    progress -= partialTicks;
}
//приводим прогресс от диапазона [0, 5] к диапазону [0, 1] и обрезаем, если он выходит за рамки.
progress = MathHelper.clampFloat(progress / MAX_AIMING_TIMER, 0, 1);
float oprogress = 1 - progress;

//теперь остается отрендерить, интерполируя наши два положения по переменной progress.
//Эти массивы нужны чисто для удобства, а создавать их лучше как константы.
float[] tr1 = {0.0F, 0.0F, 1.0F};
float[] tr2 = {0.0F, 0.0F, 2.0F};
float[] rot1 = {45.0F, 0.0F, 0.0F};
float[] rot2 = {90.0F, 0.0F, 0.0F};
GL11.glTranslatef(tr1[0] * oprogress + tr2[0] * progress, tr1[1] * oprogress + tr2[1] * progress, tr1[2] * oprogress + tr2[2] * progress);
GL11.glRotate(rot1[0] * oprogress + rot2[0] * progress, rot1[1] * oprogress + rot2[1] * progress, rot1[2] * oprogress + rot2[2] * progress);


3) Ловишь событие RenderGameOverlayEvent.Pre, проверяешь оружие в руках у игрока и event.type, если в руках пушка, а event.type == ElementType.CROSSHAIRS, то event.setCanceled(true).
 
GloomyFolken написал(а):
1) Разберешься на примере той же стрелы.


2) Нужно интерполировать между начальным и конечным положением. Допустим, начальное положение ты задаешь так:
Код:
GL11.glTranslatef(0.0F, 0.0F, 1.0F);
GL11.glRotatef(45.0F, 0.0F, 0.0F);
А конечное - так:
Код:
GL11.glTranslatef(0.0F, 0.0F, 2.0F);
GL11.glRotatef(90.0F, 0.0F, 0.0F);
Заводишь где-нибудь int переменную aimProgress, отвечающую за процесс прицеливания. Допустим, максимальное значение пусть будет 5 (за 5 тиков полностью прицеливаешься). Каждый тик с зажатой ПКМ aimProgress увеличивается на 1, пока не достигнет 5. Каждый тик без зажатой ПКМ уменьшается на 1, пока не достигнет 0. Запиши максимальное значение куда-нибудь как константу, например, MAX_AIMING_TIMER.

Теперь это нужно плавно анимировать. Во-первых, у тебя не 20 ФПС, а больше, и возможных положений тоже больше пяти. Так что пишешь в коде рендера как-то так:
Код:
//Minecraft.timer - приватное поле, но все приватные поля становятся публичными при запуске игры из-за форджа, и единственная проблема - скомпилировать. Если пишешь под старые версии и можешь менять сорцы майна, то просто сделай timer публичным, иначе вытаскивай через рефлексию или еще каким-нибудь костылем.
float partialTicks = Minecraft.getMinecraft().timer.renderPartialTicks;
float progress = твоя_интовая_переменная_с_прогрессом_прицеливания;
//проверка, зажата ли ПКМ (уменьшается или увеличивается прогресс прицеливания в данный момент). Это - самый банальный способ проверки, есть более удачные. Проверяй так же, как когда увеличиваешь/уменьшаешь прогресс прицеливания. Как другой вариант, можно просто записывать, что произошло последний раз при изменении прогресса прицеливания: увеличение или уменьшение.
if (Mouse.isKeyDown(1)){
    progress += partialTicks;
} else {
    progress -= partialTicks;
}
//приводим прогресс от диапазона [0, 5] к диапазону [0, 1] и обрезаем, если он выходит за рамки.
progress = MathHelper.clampFloat(progress / MAX_AIMING_TIMER, 0, 1);
float oprogress = 1 - progress;

//теперь остается отрендерить, интерполируя наши два положения по переменной progress.
//Эти массивы нужны чисто для удобства, а создавать их лучше как константы.
float[] tr1 = {0.0F, 0.0F, 1.0F};
float[] tr2 = {0.0F, 0.0F, 2.0F};
float[] rot1 = {45.0F, 0.0F, 0.0F};
float[] rot2 = {90.0F, 0.0F, 0.0F};
GL11.glTranslatef(tr1[0] * oprogress + tr2[0] * progress, tr1[1] * oprogress + tr2[1] * progress, tr1[2] * oprogress + tr2[2] * progress);
GL11.glRotate(rot1[0] * oprogress + rot2[0] * progress, rot1[1] * oprogress + rot2[1] * progress, rot1[2] * oprogress + rot2[2] * progress);


3) Ловишь событие RenderGameOverlayEvent.Pre, проверяешь оружие в руках у игрока и event.type, если в руках пушка, а event.type == ElementType.CROSSHAIRS, то event.setCanceled(true).
Огромное спасибо анимация работает! Только вопрос для каждой анимации нужна своя переменная aimProgress (имею ввиду подобную aimProgress)?
 
GloomyFolken написал(а):
Ну да, одно действие - один "прогресс" этого действия.
Спасибо за ответ! Тему можно закрывать.
[merge_posts_bbcode]Добавлено: 30.03.2015 15:35:33[/merge_posts_bbcode]

И все же возник еще 1 вопрос. Ведь для однотипных анимаций одного прогресса хватит. Только при переключении айтемов эту переменную надо обнулять. Вы не подскажите какой для этого эвент в 1.6.4 нужен?
 
Назад
Сверху