Documentation - Merge ACEX (#8526)

* Documentation - Merge ACEX

* Only show ACEX prefix note on framework pages

* Documentation - Use ACEX prefix in Fortify events
See #8553

* Cleanup acex from config.yml

* English is weird

Co-authored-by: PabstMirror <pabstmirror@gmail.com>
This commit is contained in:
jonpas 2021-10-21 18:27:25 +02:00 committed by GitHub
parent ca09b88869
commit c29ae977fc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
28 changed files with 60 additions and 271 deletions

View File

@ -12,14 +12,6 @@ ace:
patch: 0
build: 63
acex:
githubUrl: https://github.com/acemod/ACEX
version:
major: 3
minor: 5
patch: 4
build: 23
markdown: kramdown
kramdown:

View File

@ -12,14 +12,6 @@ ace:
patch: 2
build: 49
acex:
githubUrl: https://github.com/acemod/ACEX
version:
major: 3
minor: 5
patch: 2
build: 19
markdown: kramdown
kramdown:

View File

@ -1,15 +0,0 @@
{% if include.component == "fortify" %}
`acex_main`, `ace_interaction`
{% endif %}
{% if include.component == "headless" %}
`acex_main`
{% endif %}
{% if include.component == "sitting" %}
`acex_main`, `ace_interaction`
{% endif %}
{% if include.component == "viewrestriction" %}
`acex_main`
{% endif %}

View File

@ -1,5 +1,5 @@
{% for node in feature_list %}
{% if node.mod == mod and node.group == group and node.category == category %}
{% if node.group == group and node.category == category %}
{% if page.url == node.url or (page.parent != null and node.short == page.parent) %}
<li class="active"><a href="{{ site.baseurl }}{{node.url}}" class="active">{{node.title}}</a></li>
{% else %}
@ -8,6 +8,5 @@
{% endif %}
{% endfor %}
{% assign feature_list = nil %}
{% assign mod = nil %}
{% assign group = nil %}
{% assign category = nil %}

View File

@ -1,5 +1,5 @@
{% for node in pages_list %}
{% if node.mod == mod and node.group == group %}
{% if node.group == group %}
{% if page.url == node.url or (page.parent != null and node.short == page.parent) %}
<li class="active"><a href="{{ site.baseurl }}{{node.url}}" class="active">{{node.title}}</a></li>
{% else %}
@ -8,5 +8,4 @@
{% endif %}
{% endfor %}
{% assign pages_list = nil %}
{% assign mod = nil %}
{% assign group = nil %}

View File

@ -31,14 +31,10 @@ layout: compress
{% elsif page.mod == 'acex' %}
{% if page.version.major > site.acex.version.major %}
<em>Will be {{type}} in ACEX v{{page.version.major}}.{{page.version.minor}}.{{page.version.patch}}</em>
{% elsif page.version.major == site.acex.version.major and page.version.minor > site.acex.version.minor %}
<em>Will be {{type}} in ACEX v{{page.version.major}}.{{page.version.minor}}.{{page.version.patch}}</em>
{% elsif page.version.major == site.acex.version.major and page.version.minor == site.acex.version.minor and page.version.patch > site.acex.version.patch %}
<em>Will be {{type}} in ACEX v{{page.version.major}}.{{page.version.minor}}.{{page.version.patch}}</em>
{% if page.version.removed %}
<em>Removed in ACE3 v{{page.version.major}}.{{page.version.minor}}.{{page.version.patch}}</em>
{% else %}
<em>{{typeCapital}} in ACEX v{{page.version.major}}.{{page.version.minor}}.{{page.version.patch}}</em>
<em>Moved to ACE3 in v3.14.0 (originally added in ACEX v{{page.version.major}}.{{page.version.minor}}.{{page.version.patch}})</em>
{% endif %}
{% endif %}
@ -63,6 +59,12 @@ layout: compress
<section class="medium-8 medium-pull-4 small-12 columns">
<h1>{{page.title}}</h1>
{% if page.mod == 'acex' and page.group == 'framework' %}
<div class="panel callout">
<p>Component may use <kbd>acex</kbd> prefix in certain variables, events and class names for backwards compatibility!</p>
</div>
{% endif %}
<div id="content">{{ content }}</div>
</section>
</div>

View File

@ -55,23 +55,6 @@ sitemap:
</div>
</div>
<div class="row">
<div class="large-12 columns">
<div class="panel callout radius">
<div class="row">
<div class="large-7 columns">
<h2>ACEX</h2>
<h3 class="subheader">Useful frameworks and features</h3>
</div>
<div class="large-5 columns">
<a class="button" target="_blank" href="{{site.acex.githubUrl}}/releases/latest" onclick="app.analytics.sendEvent('ExternalLink', 'Click', this.href);" rel="noopener"><i class="fa fa-download"></i> Get ACEX v{{site.acex.version.major}}.{{site.acex.version.minor}}.{{site.acex.version.patch}}</a><br>
<a href="{{site.baseurl}}/wiki/user/installation-guide-acex.html">Installation Guide</a>
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="large-12 columns">

View File

@ -1,7 +1,7 @@
---
layout: wiki
title: Class Names
description: List of class names present in ACE3 and ACEX which mission makers, modders and scripters can use.
description: List of class names present in ACE3 which mission makers, modders and scripters can use.
group: wiki
order: 11
parent:

View File

@ -10,7 +10,7 @@ parent: wiki
<div class="row">
<div class="large-4 medium-4 columns">
<h1>Development</h1>
<p>Information about developing ACE3 and ACEX, from setting up the development environment to guidelines and tips.</p>
<p>Information about developing ACE3, from setting up the development environment to guidelines and tips.</p>
</div>
<div class="large-8 medium-8 columns">
<nav>

View File

@ -10,6 +10,7 @@ version:
major: 3
minor: 3
patch: 0
redirect_from: "/wiki/featurex/fortify.html"
---
## 1. Overview
@ -38,4 +39,4 @@ Please note that to use this function the Fortify module needs to be placed down
## 4. Dependencies
{% include dependenciesx_list.md component="fortify" %}
{% include dependencies_list.md component="fortify" %}

View File

@ -10,6 +10,7 @@ version:
major: 3
minor: 0
patch: 0
redirect_from: "/wiki/featurex/headless.html"
---
## 1. Overview
@ -18,4 +19,4 @@ Enables automatic passing of AI groups to (up to 3) Headless Clients using round
## 2. Dependencies
{% include dependenciesx_list.md component="headless" %}
{% include dependencies_list.md component="headless" %}

View File

@ -5,6 +5,7 @@ group: subNav
order: 1
short: wiki
parent: wiki
redirect_from: "/wiki/featurex"
---
<div class="row">
@ -19,7 +20,6 @@ parent: wiki
<nav>
<ul>
{% assign feature_list = site.pages | sort: "title" %}
{% assign mod = 'ace' %}
{% assign group = 'feature' %}
{% assign category = 'general' %}
{% include feature_list %}
@ -31,7 +31,6 @@ parent: wiki
<nav>
<ul>
{% assign feature_list = site.pages | sort: "title" %}
{% assign mod = 'ace' %}
{% assign group = 'feature' %}
{% assign category = 'interaction' %}
{% include feature_list %}
@ -43,7 +42,6 @@ parent: wiki
<nav>
<ul>
{% assign feature_list = site.pages | sort: "title" %}
{% assign mod = 'ace' %}
{% assign group = 'feature' %}
{% assign category = 'realism' %}
{% include feature_list %}
@ -55,7 +53,6 @@ parent: wiki
<nav>
<ul>
{% assign feature_list = site.pages | sort: "title" %}
{% assign mod = 'ace' %}
{% assign group = 'feature' %}
{% assign category = 'equipment' %}
{% include feature_list %}

View File

@ -60,8 +60,8 @@ Your weapon will be even more prone to jams, and it'll get worse if you don't le
- Weapons and spare barrels will cool off over time.
- Cooling speed of weapons in increased in windy or rainy weather, and when swimming.
- If AceX Field Rations is loaded then weapons can be cooled with canteens, water bottles, or other beverage items. This does not require the Field Rations system to be enabled.
- If AceX Field Rations is enabled then weapons can also be cooled with the same water sources used to refill canteens and water bottles.
- If ACE Field Rations is loaded then weapons can be cooled with canteens, water bottles, or other beverage items. This does not require the Field Rations system to be enabled.
- If ACE Field Rations is enabled then weapons can also be cooled with the same water sources used to refill canteens and water bottles.
### 2.5 Avoiding cookoffs

View File

@ -10,11 +10,9 @@ version:
major: 3
minor: 0
patch: 0
redirect_from: "/wiki/feature/sitting.html"
redirect_from: "/wiki/featurex/sitting.html"
---
_Sitting has been moved from ACE3 (in v3.8.0) to ACEX._
## 1. Overview
Adds the ability to sit on chairs.
@ -28,4 +26,4 @@ Please note that to be able to use this function the sitting module need to be p
## 3. Dependencies
{% include dependenciesx_list.md component="sitting" %}
{% include dependencies_list.md component="sitting" %}

View File

@ -10,6 +10,7 @@ version:
major: 3
minor: 2
patch: 0
redirect_from: "/wiki/featurex/volume.html"
---
## 1. Overview
@ -25,10 +26,10 @@ Adds the possibility of setting a keybind to toggle volume of game and music. It
## 3. Usage
1. Set the keybind in ACEX controls
1. Set the keybind in ACE controls
2. Enable the feature in ACE options
3. Change the options to your liking
## 4. Dependencies
{% include dependenciesx_list.md component="volume" %}
{% include dependencies_list.md component="volume" %}

View File

@ -1,65 +0,0 @@
---
title: ACEX Feature documentation
layout: default
group: subNav
order: 1
short: wiki
parent: wiki
---
<div class="row">
<div class="large-12 columns">
<h1>ACEX Features</h1>
<p>Overviews and details of ACEX features, their usage and implementations.</p>
</div>
</div>
<div class="row">
<div class="large-3 medium-4 small-6 columns">
<h2>General</h2>
<nav>
<ul>
{% assign feature_list = site.pages | sort: "title" %}
{% assign mod = 'acex' %}
{% assign group = 'feature' %}
{% assign category = 'general' %}
{% include feature_list %}
</ul>
</nav>
</div>
<div class="large-3 medium-4 small-6 columns">
<h2>Interaction</h2>
<nav>
<ul>
{% assign feature_list = site.pages | sort: "title" %}
{% assign mod = 'acex' %}
{% assign group = 'feature' %}
{% assign category = 'interaction' %}
{% include feature_list %}
</ul>
</nav>
</div>
<div class="large-3 medium-4 small-6 columns">
<h2>Realism</h2>
<nav>
<ul>
{% assign feature_list = site.pages | sort: "title" %}
{% assign mod = 'acex' %}
{% assign group = 'feature' %}
{% assign category = 'realism' %}
{% include feature_list %}
</ul>
</nav>
</div>
<div class="large-3 medium-4 small-6 columns">
<h2>Equipment</h2>
<nav>
<ul>
{% assign feature_list = site.pages | sort: "title" %}
{% assign mod = 'acex' %}
{% assign group = 'feature' %}
{% assign category = 'equipment' %}
{% include feature_list %}
</ul>
</nav>
</div>
</div>

View File

@ -1,7 +1,7 @@
---
layout: wiki
title: Field Rations Framework
description: Explains how to set-up ACEX Field Rations.
description: Explains how to set-up ACE Field Rations.
group: framework
parent: wiki
mod: acex
@ -9,6 +9,7 @@ version:
major: 3
minor: 4
patch: 0
redirect_from: "/wiki/frameworkx/field-rations-framework.html"
---
## 1. Config Values
@ -51,7 +52,7 @@ Event Name | Passed Parameter(s) | Locality | Description
### 3.1 Getting water supply
`acex_field_rations_fnc_getRemainingWater`
`ace_field_rations_fnc_getRemainingWater`
```cpp
* Returns the remaining water in a source.
@ -63,12 +64,12 @@ Event Name | Passed Parameter(s) | Locality | Description
* Remaining water <NUMBER>
*
* Example:
* [_source] call acex_field_rations_fnc_getRemainingWater
* [_source] call ace_field_rations_fnc_getRemainingWater
```
### 3.2 Setting water supply
`acex_field_rations_fnc_setRemainingWater`
`ace_field_rations_fnc_setRemainingWater`
```cpp
* Sets the remaining water supply for given water source.
@ -81,12 +82,12 @@ Event Name | Passed Parameter(s) | Locality | Description
* None
*
* Example:
* [_source, 1000] call acex_field_rations_fnc_setRemainingWater
* [_source, 1000] call ace_field_rations_fnc_setRemainingWater
```
### 3.3 Adding a status modifier
`acex_field_rations_fnc_addStatusModifier`
`ace_field_rations_fnc_addStatusModifier`
```cpp
* Adds a status modifier. Should be called on all machines.
@ -100,5 +101,5 @@ Event Name | Passed Parameter(s) | Locality | Description
* None
*
* Example:
* [0, {random 1}] call acex_field_rations_fnc_addStatusModifier
* [0, {random 1}] call ace_field_rations_fnc_addStatusModifier
```

View File

@ -10,6 +10,7 @@ version:
major: 3
minor: 3
patch: 0
redirect_from: "/wiki/frameworkx/fortify-framework.html"
---
## 1. Overview
@ -31,7 +32,7 @@ If the Fortify module is present in the mission, server admins can use chat comm
There are two ways of adding custom presets to your mission, either via code or through desciption.ext.
To add a preset via code you use the function `call acex_fortify_fnc_registerObjects`. Also enables Fortify.
To add a preset via code you use the function `call ace_fortify_fnc_registerObjects`. Also enables Fortify.
```cpp
* Registers the given objects in the given side's player interaction menu.
@ -48,7 +49,7 @@ To add a preset via code you use the function `call acex_fortify_fnc_registerObj
* None
*
* Example:
* [west, 5000, [["Land_BagFence_Long_F", 5], ["Land_BagBunker_Small_F", 50]]] call acex_fortify_fnc_registerObjects
* [west, 5000, [["Land_BagFence_Long_F", 5], ["Land_BagBunker_Small_F", 50]]] call ace_fortify_fnc_registerObjects
```
Adding it through `description.ext` you use:
@ -78,7 +79,7 @@ To verify that an object isn't above a certain terrain height we can check the h
params ["_unit", "_object", "_cost"];
private _return = (getPosATL _object) select 2 < 1;
_return
}] call acex_fortify_fnc_addDeployHandler;
}] call ace_fortify_fnc_addDeployHandler;
```

View File

@ -10,6 +10,7 @@ version:
major: 3
minor: 0
patch: 0
redirect_from: "/wiki/frameworkx/headless-framework.html"
---
## 1. Overview
@ -22,9 +23,9 @@ A server admin or mission maker can also define the minimal delay between transf
### 1.1 End Mission
Since ACEX v3.1.0 Headless component supports automatic ending of mission when Headless Clients are connencted but no players are present. It is basically `server.cfg` setting `persistent = 1;` with Headless Client support.
Since ACEX v3.1.0 _(before merge into ACE3)_ Headless component supports automatic ending of mission when Headless Clients are connencted but no players are present. It is basically `server.cfg` setting `persistent = 1;` with Headless Client support.
As of ACEX v3.2.0 this feature can also be enabled without enabling AI distribution (overall setting).
As of ACEX v3.2.0 _(before merge into ACE3)_ this feature can also be enabled without enabling AI distribution (overall setting).
## 2. Scripting
@ -46,4 +47,4 @@ Some Arma 3 features are incompatible, this is up to BI to add support. Disable
Additionally, groups will not be transferred due to lack of support if they:
- Have waypoints with synchronized triggers (waypoint would not change status based on trigger condition) (added in ACEX v3.2.0)
- Have waypoints with synchronized triggers (waypoint would not change status based on trigger condition) (added in ACEX v3.2.0 - _before merge into ACE3_)

View File

@ -9,6 +9,7 @@ redirect_from:
- "/wiki/missionmaker/mission-tools.html"
- "/wiki/missionmaker/modules.html"
- "/wiki/missionmaker/useful-functions.html"
- "/wiki/frameworkx"
---
<div class="row">
@ -21,7 +22,6 @@ redirect_from:
<nav>
<ul>
{% assign pages_list = site.pages | sort: "title" %}
{% assign mod = 'ace' %}
{% assign group = 'framework' %}
{% include pages_list %}
</ul>

View File

@ -1,7 +1,7 @@
---
layout: wiki
title: Sitting Framework
description: Explains how to set-up sitting objects (eg. chairs) with ACEX sitting system.
description: Explains how to set-up sitting objects (eg. chairs) with ACE sitting system.
group: framework
order: 5
parent: wiki
@ -10,12 +10,9 @@ version:
major: 3
minor: 2
patch: 0
redirect_from: "/wiki/framework/sitting-framework.md"
redirect_from: "/wiki/frameworkx/sitting-framework.md"
---
_Sitting has been moved from ACE3 (in v3.8.0) to ACEX._
## 1. Requirements
Object must inherit from `ThingX` or any of its sub-classes.

View File

@ -1,26 +0,0 @@
---
title: ACEX Framework documentation
layout: default
group: subNav
order: 1
short: wiki
parent: wiki
---
<div class="row">
<div class="large-4 medium-4 columns">
<h1>Frameworks</h1>
<p>Public API implemented by ACEX which mission makers, modders and scripters can use.</p>
</div>
<div class="large-8 medium-8 columns">
<nav>
<ul>
{% assign pages_list = site.pages | sort: "title" %}
{% assign mod = 'acex' %}
{% assign group = 'framework' %}
{% include pages_list %}
</ul>
</nav>
</div>
</div>

View File

@ -35,13 +35,13 @@ parent:
<div class="large-6 medium-2 columns">
<h3>User</h3>
<p>General information about ACE3 and ACEX, installation guides and troubleshooting.</p>
<p>General information about ACE3, installation guides and troubleshooting.</p>
<a href="{{ site.baseurl }}/wiki/user/" class="button">Learn more</a>
</div>
<div class="large-6 medium-2 columns">
<h3>Class Names</h3>
<p>List of class names present in ACE3 and ACEX which mission makers, modders and scripters can use.</p>
<p>List of class names present in ACE3 which mission makers, modders and scripters can use.</p>
<a href="{{ site.baseurl }}/wiki/class-names.html" class="button">Learn more</a>
</div>
</div>
@ -52,13 +52,13 @@ parent:
<div class="row">
<div class="large-6 medium-2 columns">
<h3>ACE3 Features</h3>
<h3>Features</h3>
<p>Overviews and details of ACE3 features, their usage and implementations.</p>
<a href="{{ site.baseurl }}/wiki/feature/" class="button">Learn more</a>
</div>
<div class="large-6 medium-2 columns">
<h3>ACE3 Frameworks</h3>
<h3>Frameworks</h3>
<p>Public API implemented by ACE3 which mission makers, modders and scripters can use.</p>
<a href="{{ site.baseurl }}/wiki/framework/" class="button">Learn more</a>
@ -69,30 +69,11 @@ parent:
<hr/>
</div>
<div class="row">
<div class="large-6 medium-2 columns">
<h3>ACEX Features</h3>
<p>Overviews and details of ACEX features, their usage and implementations.</p>
<a href="{{ site.baseurl }}/wiki/featurex/" class="button">Learn more</a>
</div>
<div class="large-6 medium-2 columns">
<h3>ACEX Frameworks</h3>
<p>Public API implemented by ACEX which mission makers, modders and scripters can use.</p>
<a href="{{ site.baseurl }}/wiki/frameworkx/" class="button">Learn more</a>
</div>
</div>
<div class="row">
<hr/>
</div>
<div class="row">
<div class="large-6 medium-2 columns">
<h3>Development</h3>
<p>Information about developing ACE3 and ACEX, from setting up the development environment to guidelines and tips.</p>
<p>Information about developing ACE3, from setting up the development environment to guidelines and tips.</p>
<a href="{{ site.baseurl }}/wiki/development/" class="button">Learn more</a>
</div>
</div>

View File

@ -15,6 +15,9 @@ It provides many [features](../feature) which enhance realism gameplay, and prov
## 2. ACEX
**ACEX** is an optional package of mods that compliments the ACE3 modification.
**ACEX** was an optional package of mods that complimented the ACE3 modification.
<div class="panel callout">
<p><b>ACEX was merged into ACE3 v3.14.0!</b> Remove it if you still have it installed.</p>
</div>
ACEX [features](../featurex) enhance gameplay, but may focus on functionality over realism. It also provides [frameworks](../frameworkx) which do not fit into the scope of ACE3 but may be useful to mission makers, modders and scripters.

View File

@ -10,7 +10,7 @@ parent: wiki
<div class="row">
<div class="large-4 medium-4 columns">
<h1>User</h1>
<p>General information about ACE3 and ACEX, installation guides and troubleshooting.</p>
<p>General information about ACE3, installation guides and troubleshooting.</p>
</div>
<div class="large-8 medium-8 columns">
<nav>

View File

@ -1,31 +0,0 @@
---
layout: wiki
title: ACEX Installation Guide
description: Step-by-step guide for installing ACEX
group: user
order: 2
parent: wiki
---
## 1. Overview
This guide will explain how to get ACEX up and running.
## 2. Prerequisites
- Download [CBA](https://github.com/CBATeam/CBA_A3/releases/latest).
- Download [ACE3]({{site.ace.githubUrl}}/releases/latest).
- Download [ACEX]({{site.acex.githubUrl}}/releases/latest).
## 3. Install ACEX
- Extract CBA, ACE and ACEX .zip files into your Arma 3 folder. By default it is located in:
- 32-Bit - `C:/Program Files/Steam/Steamapps/Common/Arma 3/`
- 64-Bit - `C:/Program Files (x86)/Steam/Steamapps/Common/Arma 3/`
- After extraction you should have the `@acex`, `@ace` and `@CBA_A3` folders inside your Arma 3 folder.
## 5. Launch Arma 3 with ACEX
- Launch Arma 3 to start the official game launcher.
- Click `Mods` and make sure the checkboxes next to `ace`, `acex` and `CBA_A3` are ticked.
- Click `Play`

View File

@ -1,10 +1,11 @@
---
layout: wiki
title: ACE3 Installation Guide
title: Installation Guide
description: Step-by-step guide for installing ACE3
group: user
order: 1
parent: wiki
redirect_from: "/wiki/user/installation-guide-acex.html"
---
## 1. Overview

View File

@ -1,9 +1,8 @@
#!/usr/bin/env python3
# Author: Jonpas
# Extracts dependencies to "docs/_includes/dependencies_list.md" and "docs/_includes/dependenciesx_list.md" for use with Jekyll include statement.
# Extracts dependencies to "docs/_includes/dependencies_list.md" for use with Jekyll include statement.
# Use the following line to add dependencies to an ACE3 feature page: {% include dependencies_list.md component="<component>" %}
# Use the following line to add dependencies to an ACEX feature page: {% include dependenciesx_list.md component="<component>" %}
import os
@ -20,28 +19,20 @@ def main():
if "--markdown" not in sys.argv:
print("""
#############################################
# Extract ACE3 and ACEX Module Dependencies #
# Extract ACE3 Module Dependencies #
# (for Jekyll include) #
#############################################
""")
# Mod paths
script_path = os.path.realpath(__file__)
project_path = os.path.dirname(os.path.dirname(script_path))
addons_path = os.path.join(project_path, "addons")
optionals_path = os.path.join(project_path, "optionals")
if "--acex" in sys.argv:
projectx_path = sys.argv[sys.argv.index("--acex") + 1]
addonsx_path = os.path.join(projectx_path, "addons")
optionalsx_path = os.path.join(projectx_path, "optionals")
# Documentation paths
include_path = os.path.join(project_path, "docs", "_includes")
dependencies_path = os.path.join(include_path, "dependencies_list.md")
dependenciesx_path = os.path.join(include_path, "dependenciesx_list.md")
# Prepare files and paths list
if not os.path.exists(include_path):
@ -57,13 +48,6 @@ def main():
dependencies_path_current = dependencies_path
addons_path_current = addons_path
if "--acex" in sys.argv:
open(dependenciesx_path, "w", newline="\n").close()
if os.path.exists(addonsx_path):
addons += [".."] + sorted(next(os.walk(addonsx_path))[1])
if os.path.exists(optionalsx_path):
addons += ["."] + sorted(next(os.walk(optionalsx_path))[1])
# Iterate through folders in the addons directories
for folder in addons:
# Ignore "main" component
@ -74,14 +58,6 @@ def main():
if folder == ".":
if addons_path_current == addons_path:
addons_path_current = optionals_path
else:
addons_path_current = optionalsx_path
continue
# Change to ACEX list on ".." separator
if folder == "..":
dependencies_path_current = dependenciesx_path
addons_path_current = addonsx_path
continue
# Open config.cpp file and extract dependencies