actionattachtoconstruction.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. class ActionAttachToConstruction: ActionSingleUseBase
  2. {
  3. void ActionAttachToConstruction()
  4. {
  5. m_Text = "#attach";
  6. }
  7. override void CreateConditionComponents()
  8. {
  9. m_ConditionItem = new CCINonRuined;
  10. m_ConditionTarget = new CCTCursor;
  11. }
  12. override ActionData CreateActionData()
  13. {
  14. AttachActionData action_data = new AttachActionData;
  15. return action_data;
  16. }
  17. override bool ActionCondition( PlayerBase player, ActionTarget target, ItemBase item )
  18. {
  19. EntityAI target_entity = EntityAI.Cast( target.GetObject() );
  20. if ( target_entity && target_entity.CanUseConstruction() )
  21. {
  22. string selection = target_entity.GetActionComponentName( target.GetComponentIndex() );
  23. ConstructionActionData construction_action_data = player.GetConstructionActionData();
  24. int slot_id = construction_action_data.GetAttachmentSlotFromSelection( player, target_entity, item, selection );
  25. BaseBuildingBase base_building;
  26. if ( slot_id != -1 )
  27. {
  28. base_building = BaseBuildingBase.Cast( target_entity );
  29. if ( base_building.CheckSlotVerticalDistance( slot_id, player ) && base_building.IsPlayerInside(player,"") )
  30. {
  31. construction_action_data.SetSlotId( slot_id );
  32. return true;
  33. }
  34. }
  35. else if ( item.IsKindOf("CombinationLock") )
  36. {
  37. base_building = BaseBuildingBase.Cast( target_entity );
  38. //simpler hack
  39. /*construction_action_data.SetSlotId( InventorySlots.GetSlotIdFromString("Att_CombinationLock") );
  40. return true;*/
  41. InventoryLocation loc = new InventoryLocation;
  42. bool found = base_building.GetInventory().FindFreeLocationFor(item,FindInventoryLocationType.ATTACHMENT,loc);
  43. if (found)
  44. {
  45. //Print("slot name: " + InventorySlots.GetSlotName(loc.GetSlot()) );
  46. construction_action_data.SetSlotId( loc.GetSlot() );
  47. return true;
  48. }
  49. }
  50. }
  51. return false;
  52. }
  53. override void OnStartClient( ActionData action_data )
  54. {
  55. //set action initiator
  56. ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
  57. construction_action_data.SetActionInitiator( action_data.m_Player );
  58. }
  59. protected void OnExecuteImpl( ActionData action_data )
  60. {
  61. EntityAI target_entity = EntityAI.Cast( action_data.m_Target.GetObject() );
  62. ItemBase item = ItemBase.Cast( action_data.m_MainItem );
  63. ConstructionActionData construction_action_data = action_data.m_Player.GetConstructionActionData();
  64. int slot_id = construction_action_data.GetSlotId();
  65. if ( slot_id != -1 )
  66. {
  67. ItemBase attachment = ItemBase.Cast( target_entity.GetInventory().FindAttachment( slot_id ) );
  68. if ( attachment )
  69. {
  70. //combine
  71. attachment.CombineItemsClient( item );
  72. }
  73. else// if( target_entity.GetInventory().CanAddAttachmentEx( item, slot_id ) )
  74. {
  75. ItemBase item_base = ItemBase.Cast( item );
  76. float stackable = item_base.GetTargetQuantityMax( slot_id );
  77. if( stackable == 0 || stackable >= item_base.GetQuantity() )
  78. {
  79. action_data.m_Player.PredictiveTakeEntityToTargetAttachmentEx(target_entity, item, slot_id);
  80. }
  81. else if( stackable != 0 && stackable < item_base.GetQuantity() )
  82. {
  83. item_base.SplitIntoStackMaxClient( target_entity, slot_id );
  84. }
  85. }
  86. }
  87. }
  88. override void OnExecuteClient( ActionData action_data )
  89. {
  90. ClearInventoryReservationEx(action_data);
  91. OnExecuteImpl(action_data);
  92. }
  93. override void OnExecuteServer( ActionData action_data )
  94. {
  95. if ( !GetGame().IsMultiplayer() )
  96. {
  97. ClearInventoryReservationEx(action_data);
  98. OnExecuteImpl(action_data); // single player
  99. }
  100. }
  101. }