|
发表于 2023-4-12 15:37:43
|
显示全部楼层
本帖最后由 cjy4312 于 2023-4-12 15:49 编辑
- package data.scripts.weapons;
- import com.fs.starfarer.api.Global;
- import com.fs.starfarer.api.campaign.CargoAPI;
- import com.fs.starfarer.api.combat.CombatEngineAPI;
- import com.fs.starfarer.api.combat.EveryFrameWeaponEffectPlugin;
- import com.fs.starfarer.api.combat.ShipAPI;
- import com.fs.starfarer.api.combat.WeaponAPI;
- import java.util.HashMap;
- import java.util.Map;
- /**
- *
- * @author cjy4312
- */
- public class ReloadFromCargoEveryFramePlugin implements EveryFrameWeaponEffectPlugin {
- private static final Map<String, Float> weapon_reload_time = new HashMap();
- private static final Map<String, Integer> weapon_reload_num = new HashMap();
- private static final Map<String, Integer> weapon_reload_start = new HashMap();
- private static final Map<String, String> weapon_reload_commodity = new HashMap();
- private static final Map<String, Float> weapon_reload_commodity_ammo = new HashMap();
- private static final Map<String, Integer> weapon_reload_ammo_AI = new HashMap();
- private int ammo = -999;
- private float timer = 0f;
- private boolean usecargo = true;
- static {
- weapon_reload_time.put("武器ID", 1f);//写1意思是装填要花1秒
- weapon_reload_num.put("武器ID", 1);//写1意思是一次装填1发弹药
- weapon_reload_start.put("武器ID", 0);//写0意思是武器弹药剩余0才开始启动装填
- weapon_reload_commodity.put("武器ID", "货物ID");//武器消耗的货物id
- weapon_reload_commodity_ammo.put("武器ID", 1f);//写1意思是每消耗1单位的货物可以换取1发弹药
- weapon_reload_ammo_AI.put("武器ID", 1);//写1意思是敌人或者友军AI使用该武器时有1发备用弹药 //不建议调用AI货仓,AI未必会带你的自定义货物
- }
- public boolean checkCargoAvailable(CombatEngineAPI engine, ShipAPI ship) { //检查当前环境是否支持调用玩家货仓
- return !(!engine.isInCampaign() || engine.isInCampaignSim() || ship == null || ship.isFighter());
- }
- public CargoAPI getCargo(CombatEngineAPI engine, ShipAPI ship, WeaponAPI weapon) { //获取玩家货仓
- if (ship.getParentStation() != null) {
- ship = ship.getParentStation();
- }
- if (ship.getFleetMember() != null) {
- if (engine.getPlayerShip().getOwner() != ship.getOwner()) {
- usecargo = false;
- return null;
- }
- return Global.getSector().getPlayerFleet().getCargo();
- }
- usecargo = false;
- return null;
- }
- @Override
- public void advance(float amount, CombatEngineAPI engine, WeaponAPI weapon) {
- if (engine.isPaused()) {
- return;
- }
- if (!weapon.getShip().isAlive()) {
- return;
- }
- String weaponid = weapon.getId();
- if (!weapon_reload_time.containsKey(weaponid) //当数据填写不正确,无法通过武器id找到全部数据,代码不运行。
- || !weapon_reload_num.containsKey(weaponid)
- || !weapon_reload_start.containsKey(weaponid)
- || !weapon_reload_commodity.containsKey(weaponid)
- || !weapon_reload_commodity_ammo.containsKey(weaponid)
- || !weapon_reload_ammo_AI.containsKey(weaponid)) {
- return;
- }
- if (ammo < weapon_reload_num.get(weaponid)) {// 补充备弹
- String commodity_id = weapon_reload_commodity.get(weapon.getId());
- ShipAPI ship = weapon.getShip();
- usecargo = checkCargoAvailable(engine, ship);
- if (commodity_id == null && usecargo) {
- usecargo = false;
- }
- CargoAPI cargo = null;
- if (usecargo) {
- cargo = getCargo(engine, ship, weapon);
- }
- if (usecargo && cargo != null) {
- while (ammo < weapon_reload_num.get(weaponid) && cargo.getCommodityQuantity(commodity_id) > 1) {
- if (ammo == -999) {
- ammo = 0;
- }
- cargo.removeCommodity(commodity_id, 1);
- ammo += weapon_reload_commodity_ammo.get(weaponid);
- }
- } else {
- if (ship.getOwner() != engine.getPlayerShip().getOwner()) {
- if (ammo == -999) {//给AI添加备用弹药,仅限一次
- ammo = weapon_reload_ammo_AI.get(weaponid);
- }
- } else {
- if (ammo == -999) {
- ammo = 0;
- }
- while (ammo < weapon_reload_num.get(weaponid)) {
- ammo += weapon_reload_commodity_ammo.get(weaponid);
- }
- }
- }
- }
- if(ammo<=0){
- return;
- }
- int now = weapon.getAmmo();
- if (now <= weapon_reload_start.get(weaponid)) {//当弹药量小于设定值,开始装填
- timer += amount;
- if (timer >= weapon_reload_time.get(weaponid)) {
- timer = 0;
- int r =weapon_reload_num.get(weaponid);
- if(r>ammo){
- r=ammo;
- }
- weapon.setAmmo(now+r);
- ammo-=r;
- }
- }
- }
- }
复制代码
|
|