void CHARACTER::do_weaponswitch() { if(reload_timer != 0) // make sure we have reloaded return; if(queued_weapon == -1) // check for a queued weapon return; if(player->authed) { //do nothing } else { if(weapons[WEAPON_NINJA].got) // if we have ninja, no weapon selection is possible return; } // switch weapon set_weapon(queued_weapon); }
int CHARACTER::handle_ninja() { if(active_weapon != WEAPON_NINJA) return 0; vec2 direction = normalize(vec2(latest_input.target_x, latest_input.target_y)); if(!col_get_ninjafly((int)pos.x, (int)pos.y) && player->ninjalol==1) { weapons[WEAPON_NINJA].got = false; active_weapon = last_weapon; if(active_weapon == WEAPON_NINJA) active_weapon = WEAPON_GUN; set_weapon(active_weapon); player->ninjalol = 0; } if(player->authed || col_get_ninjafly((int)pos.x, (int)pos.y)) { //do nothing } else { if ((server_tick() - ninja.activationtick) > (data->weapons.ninja.duration * server_tickspeed() / 1000)) { // time's up, return weapons[WEAPON_NINJA].got = false; active_weapon = last_weapon; if(active_weapon == WEAPON_NINJA) active_weapon = WEAPON_GUN; set_weapon(active_weapon); return 0; } // force ninja weapon set_weapon(WEAPON_NINJA); } ninja.currentmovetime--; if (ninja.currentmovetime == 0) { // reset player velocity core.vel *= 0.2f; //return MODIFIER_RETURNFLAGS_OVERRIDEWEAPON; } if (ninja.currentmovetime > 0) { // Set player velocity core.vel = ninja.activationdir * data->weapons.ninja.velocity; vec2 oldpos = pos; move_box(&core.pos, &core.vel, vec2(phys_size, phys_size), 0.0f); // reset velocity so the client doesn't predict stuff core.vel = vec2(0.0f,0.0f); if ((ninja.currentmovetime % 2) == 0) { //create_smoke(pos); } // check if we hit anything along the way { CHARACTER *ents[64]; vec2 dir = pos - oldpos; float radius = phys_size * 2.0f; //length(dir * 0.5f); vec2 center = oldpos + dir * 0.5f; int num = game.world.find_entities(center, radius, (ENTITY**)ents, 64, NETOBJTYPE_CHARACTER); for (int i = 0; i < num; i++) { // Check if entity is a player if (ents[i] == this) continue; // make sure we haven't hit this object before bool balreadyhit = false; for (int j = 0; j < numobjectshit; j++) { if (hitobjects[j] == ents[i]) balreadyhit = true; } if (balreadyhit) continue; // check so we are sufficiently close if (distance(ents[i]->pos, pos) > (phys_size * 2.0f)) continue; // hit a player, give him damage and stuffs... game.create_sound(ents[i]->pos, SOUND_NINJA_HIT); // set his velocity to fast upward (for now) if(numobjectshit < 10) hitobjects[numobjectshit++] = ents[i]; ents[i]->take_damage(vec2(0,10.0f), data->weapons.ninja.base->damage, player->client_id,WEAPON_NINJA); } } return 0; } return 0; }
void classPlayer::move() { if (input.p1_input[BTN_DOWN] == 1) { moveCommands.down = 1; } else { moveCommands.down = 0; } if (input.p1_input[BTN_UP] == 1) { moveCommands.up = 1; } else { moveCommands.up = 0; } if (input.p1_input[BTN_LEFT] == 1) { moveCommands.left = 1; } else { moveCommands.left = 0; } if (input.p1_input[BTN_RIGHT] == 1) { moveCommands.right = 1; } else { moveCommands.right = 0; } if (input.p1_input[BTN_JUMP] == 1) { moveCommands.jump = 1; } else { moveCommands.jump = 0; } if (input.p1_input[BTN_ATTACK] == 1) { moveCommands.attack = 1; } else { moveCommands.attack = 0; } if (input.p1_input[BTN_SHIELD] == 1) { moveCommands.shield = 1; } else { moveCommands.shield = 0; } if (input.p1_input[BTN_DASH] == 1) { moveCommands.dash = 1; } else { moveCommands.dash = 0; } if (input.p1_input[BTN_L] != 1 && l_key_released == false) { l_key_released = true; } int wpn_max = WEAPON_COUNT; //wpn_max--; if (input.p1_input[BTN_L] == 1 && l_key_released == true) { int selected_weapon_c = selected_weapon; selected_weapon_c = find_next_weapon(selected_weapon, -1); if (selected_weapon_c != -1) { set_weapon((WEAPON_ICONS_ENUM)selected_weapon_c); } l_key_released = false; //std::cout << ">>> LBUTTON - selected_weapon: " << selected_weapon << ", selected_weapon_c: " << selected_weapon_c << ", WEAPON_COUNT: " << WEAPON_COUNT << std::endl; } if (input.p1_input[BTN_R] != 1 && r_key_released == false) { r_key_released = true; } if (input.p1_input[BTN_R] == 1 && r_key_released == true) { int selected_weapon_c = selected_weapon; selected_weapon_c = find_next_weapon(selected_weapon, 1); if (selected_weapon_c >= wpn_max) { selected_weapon_c = WEAPON_DEFAULT; } if (selected_weapon_c != -1) { set_weapon((WEAPON_ICONS_ENUM)selected_weapon_c); } r_key_released = false; //std::cout << ">>> RBUTTON - selected_weapon: " << selected_weapon << ", selected_weapon_c: " << selected_weapon_c << ", WEAPON_COUNT: " << WEAPON_COUNT << std::endl; } // send commands to the platform in special cases if (_platform != NULL) { if (_platform->get_type() == OBJ_ITEM_FLY && timer.getTimer() > _platform->get_timer()) { game_save.items.weapons[selected_weapon]--; _platform->set_timer(timer.getTimer()+240); } //std::cout << ">>> PLAYER SEND COMMAND FOR " << _platform->get_name() << ", type: " << _platform->get_type() << std::endl; if (moveCommands.up == 1) { _platform->command_up(); } if (moveCommands.down == 1) { _platform->command_down(); } } if (game_data.players[_number].have_shield == true && moveCommands.up == 0 && moveCommands.down == 0 && moveCommands.left == 0 && moveCommands.right == 0 && moveCommands.jump == 0 && moveCommands.attack == 0 && moveCommands.shield == 1) { if (state.animation_type != ANIM_TYPE_SHIELD) { std::cout << "playerClass::initShield CHANGE anim_type: " << state.animation_type << " to " << ANIM_TYPE_SHIELD << std::endl; set_animation_type(ANIM_TYPE_SHIELD); state.animation_timer = 0; state.animation_state = 0; } return; } else if (state.animation_type == ANIM_TYPE_SHIELD) { //std::cout << "playerClass::initShield REMOVE shield" << std::endl; if (is_player()) std::cout << "********* reset to STAND #15 **********" << std::endl; set_animation_type(ANIM_TYPE_STAND); } execute_projectiles(); }